chython 3.3.2__tar.gz → 3.5__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.
- {chython-3.3.2/chython.egg-info → chython-3.5}/PKG-INFO +1 -1
- {chython-3.3.2 → chython-3.5}/chython/__init__.py +21 -4
- {chython-3.3.2 → chython-3.5}/chython/chemistry/__init__.py +6 -3
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_canonicalize.py +95 -30
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_hydrogens.py +31 -11
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_isomers.py +246 -46
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_kekule_form.py +92 -22
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_protomers.py +31 -8
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_salts.py +2 -2
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_standardize.py +18 -5
- chython-3.5/chython/chemistry/_stereo_audit.py +762 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_tables.py +33 -4
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/acids.tsv +2 -2
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/salts.tsv +1 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/standardize_groups.tsv +9 -2
- chython-3.5/chython/chemistry/tables/stereo_audit.tsv +21 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/gen_standardize_rules.py +11 -4
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_canonicalize.py +113 -3
- chython-3.5/chython/chemistry/test/test_canonicalize_atom_order.py +268 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_isomers.py +66 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_protomers.py +2 -2
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_salts.py +1 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_groups_port.py +1 -1
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_rules_merges.py +3 -3
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_rules_tsv.py +33 -11
- chython-3.5/chython/chemistry/test/test_stereo_audit.py +626 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_thiele_is_single_purpose.py +4 -11
- {chython-3.3.2 → chython-3.5}/chython/core/__init__.py +5 -6
- {chython-3.3.2 → chython-3.5}/chython/core/_canonical.pxi +356 -119
- {chython-3.3.2 → chython-3.5}/chython/core/_cip.pxi +219 -60
- {chython-3.3.2 → chython-3.5}/chython/core/_core.pyx +5 -1
- {chython-3.3.2 → chython-3.5}/chython/core/_features.pxi +15 -7
- {chython-3.3.2 → chython-3.5}/chython/core/_hydrogens.pxi +7 -5
- {chython-3.3.2 → chython-3.5}/chython/core/_inchi.pxi +100 -1
- {chython-3.3.2 → chython-3.5}/chython/core/_kekule.pxi +161 -4
- chython-3.5/chython/core/_layout_score.pxi +340 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_molecule_arena.pxi +70 -9
- {chython-3.3.2 → chython-3.5}/chython/core/_molecule_container.pxi +773 -122
- {chython-3.3.2 → chython-3.5}/chython/core/_morgan.pxi +86 -7
- {chython-3.3.2 → chython-3.5}/chython/core/_pach3.pxi +27 -14
- {chython-3.3.2 → chython-3.5}/chython/core/_query_container.pxi +36 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_reaction_passes.py +44 -16
- {chython-3.3.2 → chython-3.5}/chython/core/_rings.pxi +143 -18
- {chython-3.3.2 → chython-3.5}/chython/core/_smiles_read.pxi +579 -53
- {chython-3.3.2 → chython-3.5}/chython/core/_smiles_write.pxi +585 -83
- {chython-3.3.2 → chython-3.5}/chython/core/_smirks_patch.pxi +61 -11
- {chython-3.3.2 → chython-3.5}/chython/core/_smirks_read.pxi +97 -2
- {chython-3.3.2 → chython-3.5}/chython/core/_stereo.pxi +4201 -410
- chython-3.5/chython/core/_stereo_meaning.pxi +820 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_thiele.pxi +180 -14
- chython-3.5/chython/core/chains.py +280 -0
- chython-3.5/chython/core/monomers.py +421 -0
- {chython-3.3.2 → chython-3.5}/chython/core/reaction.py +19 -6
- {chython-3.3.2 → chython-3.5}/chython/core/test/pach3_corpus.py +5 -5
- chython-3.5/chython/core/test/pach_v3_corpus.bin.gz +0 -0
- chython-3.5/chython/core/test/pach_v4_corpus.bin.gz +0 -0
- chython-3.5/chython/core/test/peptides.py +117 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_arena_v3_compat.py +21 -26
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_aromatic_storage.py +9 -6
- chython-3.5/chython/core/test/test_atropisomer_axis.py +100 -0
- chython-3.5/chython/core/test/test_brace_bond_fields.py +103 -0
- chython-3.5/chython/core/test/test_bridgehead_realisability.py +534 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_canonical.py +50 -0
- chython-3.5/chython/core/test/test_canonical_groups.py +243 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_canonical_mirror.py +5 -3
- chython-3.5/chython/core/test/test_canonical_stereogenic.py +93 -0
- chython-3.5/chython/core/test/test_canonicalize_stereo_groups.py +251 -0
- chython-3.5/chython/core/test/test_chains.py +104 -0
- chython-3.5/chython/core/test/test_cip_budget.py +97 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_cases.py +10 -1
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_storage.py +9 -8
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_container_log.py +6 -3
- chython-3.5/chython/core/test/test_cx_wedges.py +160 -0
- chython-3.5/chython/core/test/test_dead_stereo_groups.py +319 -0
- chython-3.5/chython/core/test/test_helical_units.py +189 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_hydrogens.py +16 -0
- chython-3.5/chython/core/test/test_identity_memo.py +70 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_kekule.py +25 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_log.py +2 -2
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_magic.py +9 -8
- chython-3.5/chython/core/test/test_monomers.py +139 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_pach3.py +22 -6
- chython-3.5/chython/core/test/test_planar_units.py +307 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_passes.py +27 -1
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_smiles.py +3 -3
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_rings.py +128 -1
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smarts_read.py +15 -6
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_read.py +106 -58
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_roundtrip.py +14 -10
- chython-3.5/chython/core/test/test_smiles_stereo_marks.py +90 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write.py +16 -2
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_cis_trans.py +79 -30
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_detached.py +3 -3
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_differential.py +95 -30
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_stereo.py +37 -30
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_patch.py +75 -4
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_stereo.py +20 -19
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_acceptance.py +132 -2
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_anchor_identity.py +2 -2
- chython-3.5/chython/core/test/test_stereo_group_meaning.py +382 -0
- chython-3.5/chython/core/test/test_stereo_group_signs.py +240 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_group_storage.py +2 -2
- chython-3.5/chython/core/test/test_stereo_liveness.py +70 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_owners.py +2 -2
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_parity.py +6 -6
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_perception.py +10 -16
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_query.py +159 -84
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_units.py +27 -12
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_stereo_v2_differential.py +11 -2
- chython-3.5/chython/core/test/test_stereogenicity_symmetry.py +169 -0
- chython-3.5/chython/core/test/test_thiele_atom_order.py +89 -0
- {chython-3.3.2 → chython-3.5}/chython/core/wedge.py +464 -32
- {chython-3.3.2 → chython-3.5}/chython/depict/__init__.py +6 -4
- {chython-3.3.2 → chython-3.5}/chython/depict/_config.py +31 -4
- {chython-3.3.2 → chython-3.5}/chython/depict/figure.py +55 -3
- {chython-3.3.2 → chython-3.5}/chython/depict/label.py +43 -17
- {chython-3.3.2 → chython-3.5}/chython/depict/layout/__init__.py +2 -2
- chython-3.5/chython/depict/layout/approved.py +181 -0
- chython-3.5/chython/depict/layout/cascade.py +979 -0
- chython-3.5/chython/depict/layout/edits.py +524 -0
- chython-3.5/chython/depict/layout/env.py +257 -0
- chython-3.5/chython/depict/layout/features.py +224 -0
- chython-3.5/chython/depict/layout/greedy.py +56 -0
- chython-3.5/chython/depict/layout/lattice.py +228 -0
- chython-3.5/chython/depict/layout/learn/__init__.py +25 -0
- chython-3.5/chython/depict/layout/learn/alphazero.py +564 -0
- chython-3.5/chython/depict/layout/learn/demos.py +263 -0
- chython-3.5/chython/depict/layout/learn/evaluate.py +94 -0
- chython-3.5/chython/depict/layout/learn/judge.py +145 -0
- chython-3.5/chython/depict/layout/learn/mcts.py +190 -0
- chython-3.5/chython/depict/layout/learn/policy.py +129 -0
- chython-3.5/chython/depict/layout/learn/replay.py +114 -0
- chython-3.5/chython/depict/layout/learn/sweep.py +81 -0
- chython-3.5/chython/depict/layout/learn/targets.py +79 -0
- chython-3.5/chython/depict/layout/learn/tensors.py +76 -0
- chython-3.5/chython/depict/layout/learn/train.py +264 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/layout/molecule.py +248 -44
- chython-3.5/chython/depict/layout/peptide.py +1231 -0
- chython-3.5/chython/depict/layout/pose.py +240 -0
- chython-3.5/chython/depict/layout/primitive.py +564 -0
- chython-3.5/chython/depict/layout/quality.py +303 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/layout/reaction.py +7 -6
- chython-3.5/chython/depict/layout/relax.py +1029 -0
- chython-3.5/chython/depict/layout/review.py +593 -0
- chython-3.5/chython/depict/layout/rings.py +1498 -0
- chython-3.5/chython/depict/layout/score.py +303 -0
- chython-3.5/chython/depict/layout/scorecard.py +340 -0
- chython-3.5/chython/depict/layout/search.py +364 -0
- chython-3.5/chython/depict/layout/shapes.py +332 -0
- chython-3.5/chython/depict/layout/templates.py +220 -0
- chython-3.5/chython/depict/layout/tree.py +431 -0
- chython-3.5/chython/depict/peptide.py +383 -0
- chython-3.5/chython/depict/test/learn/test_alphazero.py +66 -0
- chython-3.5/chython/depict/test/learn/test_demos.py +106 -0
- chython-3.5/chython/depict/test/learn/test_judge.py +56 -0
- chython-3.5/chython/depict/test/learn/test_mcts.py +79 -0
- chython-3.5/chython/depict/test/learn/test_policy.py +91 -0
- chython-3.5/chython/depict/test/learn/test_replay.py +78 -0
- chython-3.5/chython/depict/test/learn/test_targets.py +60 -0
- chython-3.5/chython/depict/test/learn/test_train.py +146 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_clean2d.py +70 -2
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_label.py +18 -0
- chython-3.5/chython/depict/test/test_layout_cascade.py +617 -0
- chython-3.5/chython/depict/test/test_layout_controller.py +543 -0
- chython-3.5/chython/depict/test/test_layout_conventions.py +1338 -0
- chython-3.5/chython/depict/test/test_layout_engine.py +196 -0
- chython-3.5/chython/depict/test/test_layout_env.py +411 -0
- chython-3.5/chython/depict/test/test_layout_primitive.py +295 -0
- chython-3.5/chython/depict/test/test_layout_relax.py +85 -0
- chython-3.5/chython/depict/test/test_peptide_draw.py +387 -0
- chython-3.5/chython/depict/test/test_peptide_layout.py +502 -0
- chython-3.5/chython/depict/test/test_quality.py +264 -0
- chython-3.5/chython/depict/test/test_review.py +201 -0
- chython-3.5/chython/depict/test/test_scorecard.py +175 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_wedge_draw.py +36 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_ctab.py +36 -1
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_facade.py +1 -2
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_sgroup.py +34 -2
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_v2000.py +15 -2
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_v3000.py +26 -9
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_data_labels.py +57 -31
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_facade.py +13 -1
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_fidelity.py +32 -5
- chython-3.5/chython/formats/ctfile/test/test_stereo_drawings.py +430 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_stereo_label.py +2 -2
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_v2000.py +12 -8
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_v3000.py +105 -6
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_wedge.py +148 -39
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/_mrv.py +5 -6
- chython-3.5/chython/formats/xml/test/test_dead_stereo_groups.py +83 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_equivalence.py +2 -1
- {chython-3.3.2 → chython-3.5}/chython/interop/_stereo.py +2 -1
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_rdkit.py +30 -4
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_stereo.py +4 -3
- {chython-3.3.2 → chython-3.5}/chython/reactions/__init__.py +8 -8
- {chython-3.3.2 → chython-3.5}/chython/reactions/_enumerate.py +404 -31
- {chython-3.3.2 → chython-3.5}/chython/reactions/_reconstruct.py +542 -110
- {chython-3.3.2 → chython-3.5}/chython/reactions/_stickers.py +46 -14
- {chython-3.3.2 → chython-3.5}/chython/reactions/_tables.py +253 -15
- chython-3.5/chython/reactions/tables/functional.tsv +524 -0
- chython-3.5/chython/reactions/tables/protective.tsv +128 -0
- chython-3.5/chython/reactions/tables/reactions.tsv +1821 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/tables/roles.tsv +2 -0
- chython-3.5/chython/reactions/test/__init__.py +18 -0
- chython-3.5/chython/reactions/test/_frozen_ids.py +2260 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_enumerate.py +22 -5
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_functional.py +10 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_probes.py +4 -1
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_protective.py +115 -39
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_reconstruct.py +409 -65
- chython-3.5/chython/reactions/test/test_reconstruct_labels.py +158 -0
- chython-3.5/chython/reactions/test/test_retro.py +172 -0
- chython-3.5/chython/reactions/test/test_retro_probes.py +61 -0
- chython-3.5/chython/reactions/test/test_retro_tables.py +142 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_roles.py +1 -1
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_stickers.py +87 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_tables.py +59 -7
- {chython-3.3.2 → chython-3.5}/chython/test/test_container_methods.py +22 -2
- {chython-3.3.2 → chython-3.5}/chython/test/test_facade_names.py +4 -4
- {chython-3.3.2 → chython-3.5}/chython/test/test_performance.py +3 -4
- {chython-3.3.2 → chython-3.5}/chython/test/test_stereo_bluebook.py +38 -53
- {chython-3.3.2 → chython-3.5/chython.egg-info}/PKG-INFO +1 -1
- {chython-3.3.2 → chython-3.5}/chython.egg-info/SOURCES.txt +89 -2
- {chython-3.3.2 → chython-3.5}/pyproject.toml +2 -2
- chython-3.3.2/chython/core/test/pach_v3_corpus.bin.gz +0 -0
- chython-3.3.2/chython/core/test/pach_v4_corpus.bin.gz +0 -0
- chython-3.3.2/chython/reactions/tables/functional.tsv +0 -321
- chython-3.3.2/chython/reactions/tables/protective.tsv +0 -138
- chython-3.3.2/chython/reactions/tables/reactions.tsv +0 -427
- chython-3.3.2/chython/reactions/test/_frozen_ids.py +0 -780
- chython-3.3.2/chython/reactions/test/gen_corpus_glossary.py +0 -146
- chython-3.3.2/chython/reactions/test/test_corpus_glossary.py +0 -91
- {chython-3.3.2 → chython-3.5}/LICENSE +0 -0
- {chython-3.3.2 → chython-3.5}/MANIFEST.in +0 -0
- {chython-3.3.2 → chython-3.5}/README.md +0 -0
- {chython-3.3.2 → chython-3.5}/build_inchi.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/_functions.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_abbreviations.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_counts.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_crippen.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_implicit.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_maccs.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_organometallics.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_perceive.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_pharmacophore.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_qed.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_residues.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_resonance.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_saturate.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_smarts.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/_tpsa.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/abbreviations.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/covalent_radii.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/crippen.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/hbond.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/maccs.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/maccs_corpus.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/pharmacophore.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/qed_alerts.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/residues.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/resonance.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/rotatable.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/standardize_metals.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/sybyl_types.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/tables/tpsa.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/_corpus.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/_oracle.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_abbreviations.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_acids_tsv.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_counts.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_covalent_radii_tsv.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_crippen.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_crippen_tsv.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_dependency_direction.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_featurizer_injection.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_featurizer_tables_lazy.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_kekule_form.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_maccs.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_maccs_corpus.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_maccs_tsv.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_organometallics.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_perceive.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_pharmacophore.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_qed.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_qed_alerts_tsv.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_reaction_hydrogen_repair.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_reaction_passes.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_residues.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_resonance.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_resonance_tsv.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_saturate.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_smarts.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_differential.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_overvalent_nitrogen.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_standardize_rules_examples.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_tpsa.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_tpsa_tsv.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_valence_report.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/chemistry/test/test_z_translation.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/RULES.md +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_descriptors.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_elements.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_facade.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_fingerprints.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_isomorphism.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_log.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_ml.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_molecule_topology.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_molecule_views.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_pach.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_query_arena.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_query_boxes.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_query_seal.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_smarts_read.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_sssr.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/_valence.pxi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/elements.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/isotopes.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/arena_v4_corpus.bin.gz +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/bench_ml.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/chytorch_oracle.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/gen_element_tables.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/gen_modeling_view_corpus.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/gen_pach3_corpus.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/gen_reaction_pach_corpus.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/gen_v3_fixtures.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/gen_v4_fixtures.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/gen_valence_rules.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/modeling_view_corpus.json.gz +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/modeling_view_corpus.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/oracle.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/pach_bond_group_corpus.bin.gz +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/pach_corpus.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/pach_v0_corpus.bin.gz +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/pach_v0_native_corpus.bin.gz +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/pach_v2_corpus.bin.gz +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/reaction_pach_corpus.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/reaction_pach_v2_corpus.bin.gz +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_aggregates.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_alternative_spellings.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_apply_scratch_probe.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_arena_f60.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_arena_identity.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_arena_v4_compat.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_assign.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_digraph.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_cip_ranking.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_clean_isotopes_and_coordinate_bonds.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_clean_stereo.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_conformers.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_copy_caches.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_derive.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_descriptors.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_element_tables.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_enrich.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_facade.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_features.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_featurizer_injection.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_fingerprints.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_geometry.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_h_unknown.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_inchi.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_interop_injection.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_isomorphism.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_meta.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_encoding.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_reaction_transition.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_state_view.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_transition_view.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_ml_unpack_differential.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_modeling_view_frozen.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_molecule.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_morgan.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_no_chython_two_imports.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_oracle.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_pach.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_pack.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_query.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_edit.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_query.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_semantics.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_serialisation.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_smirks.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_r_storage.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_container.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_identity.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_pach.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_reaction_patch_stereo.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_rings_c60.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_set_element.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_sgroups.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_r.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_aromatic.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_h_unknown.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smiles_write_sticky.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_filter.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_read.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_smirks_report.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_structure.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_thiele.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_title.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_topology.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_union_stereo.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_valence.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/test_view_surface.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/v3_fixtures.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/test/v4_fixtures.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/core/valence_rules.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/_hooks.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/bonds.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/colorbar.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/colormap.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/field.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/layout/clean2d.js +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/metrics/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/metrics/helvetica.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/metrics/times.tsv +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/overlay.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/render/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/render/svg.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/scene.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/style.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/__init__.py +0 -0
- {chython-3.3.2/chython/formats/test → chython-3.5/chython/depict/test/learn}/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_bonds.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_colorbar.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_colormap.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_field.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_figure.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_metrics.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_overlay.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_package.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_r_atom.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_scene.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_style.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_svg.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/test/test_x3dom.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/wedge.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/depict/x3dom.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/exceptions.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/_text.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/CTFILE.md +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_errors.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_hydrogens.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_rdf.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_rxn.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_sdf.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_stream.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/_tokens.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/conftest.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_aromatic.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_container_log.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_hydrogens.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_r_atom.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_rdf.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_rxn.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_sdf.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_sgroup.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_stream.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/ctfile/test/test_tokens.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/mol2.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/pdb/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_builder.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_legacy.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_mmcif.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_records.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/pdb/_star.py +0 -0
- {chython-3.3.2/chython/reactions → chython-3.5/chython/formats}/test/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/conftest.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/oracles.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_conformance.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_done_when.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_isolation.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_log_prefix.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_mmcif.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_mol2.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_no_review_bookkeeping.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_oracles.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_pdb.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_pdb_builder.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_perceive_agreement.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_read_only_facades.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_xyz.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/test/test_xyz_builder.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/_cml.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/_dialect.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/_errors.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/_facade.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/_tree.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/conftest.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_cml.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_container_log.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_dialect.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_facade.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_mrv.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_mrv_census.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xml/test/test_tree.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/formats/xyz.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_cdk.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_cdpkit.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_indigo.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_iupac.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_java.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_openbabel.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_pandas.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_rdkit.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/_records.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/config.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/conformers.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/conftest.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_cdk.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_cdpkit.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_config.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_conformers.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_coordinate_honesty.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_dispatch.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_indigo.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_iupac.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_log_delivery.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_openbabel.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_pandas.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/interop/test/test_v2_oracle.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/_numbering.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/attention/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/attention/_assign.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/attention/_encode.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/attention/_session.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/golden_subset.smi +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_attention.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_attention_assign.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_attention_encode.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_attention_isolation.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_dependency_direction.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_id_stability.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/reactions/test/test_numbering.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/__init__.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_code_hygiene.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_doc_figures.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_doc_references.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_doc_samples.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_hydrogen_parity.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_libinchi_staging.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_log_records.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_optional_numpy.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_packaging.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_r_atom_integration.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_release_build.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_v2_boundary.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython/test/test_writer_posture.py +0 -0
- {chython-3.3.2 → chython-3.5}/chython.egg-info/dependency_links.txt +0 -0
- {chython-3.3.2 → chython-3.5}/chython.egg-info/requires.txt +0 -0
- {chython-3.3.2 → chython-3.5}/chython.egg-info/top_level.txt +0 -0
- {chython-3.3.2 → chython-3.5}/setup.cfg +0 -0
- {chython-3.3.2 → chython-3.5}/setup.py +0 -0
|
@@ -29,8 +29,8 @@ from sys import modules as _modules
|
|
|
29
29
|
from types import ModuleType as _ModuleType
|
|
30
30
|
from .core import *
|
|
31
31
|
from .core import read_smarts as smarts
|
|
32
|
-
from .depict import (Clean2DEngine, DepictStyle, get_clean2d_engine, get_depict_style,
|
|
33
|
-
set_clean2d_engine, set_depict_style)
|
|
32
|
+
from .depict import (Clean2DEngine, DepictStyle, get_chain_layout, get_clean2d_engine, get_depict_style,
|
|
33
|
+
get_peptide_layout, set_chain_layout, set_clean2d_engine, set_depict_style, set_peptide_layout)
|
|
34
34
|
from .formats import *
|
|
35
35
|
# By full path, not through `formats`' star: `pdb` is that subpackage's name too and the function
|
|
36
36
|
# would shadow it.
|
|
@@ -45,8 +45,9 @@ from .interop.config import _facade_alias as _interop_facade_alias
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
class _Facade(_ModuleType):
|
|
48
|
-
"""Gives `chython` itself
|
|
49
|
-
write to
|
|
48
|
+
"""Gives `chython` itself properties, so `chython.clean2d_engine` and `chython.chain_layout` (alias
|
|
49
|
+
`chython.peptide_layout`) forward both the read and the write to their one home in `depict/_config.py`,
|
|
50
|
+
validated on the spot.
|
|
50
51
|
"""
|
|
51
52
|
@property
|
|
52
53
|
def clean2d_engine(self) -> Clean2DEngine:
|
|
@@ -56,6 +57,22 @@ class _Facade(_ModuleType):
|
|
|
56
57
|
def clean2d_engine(self, engine: Clean2DEngine):
|
|
57
58
|
set_clean2d_engine(engine)
|
|
58
59
|
|
|
60
|
+
@property
|
|
61
|
+
def chain_layout(self) -> bool:
|
|
62
|
+
return get_chain_layout()
|
|
63
|
+
|
|
64
|
+
@chain_layout.setter
|
|
65
|
+
def chain_layout(self, flag: bool):
|
|
66
|
+
set_chain_layout(flag)
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def peptide_layout(self) -> bool:
|
|
70
|
+
return get_peptide_layout()
|
|
71
|
+
|
|
72
|
+
@peptide_layout.setter
|
|
73
|
+
def peptide_layout(self, flag: bool):
|
|
74
|
+
set_peptide_layout(flag)
|
|
75
|
+
|
|
59
76
|
|
|
60
77
|
_modules[__name__].__class__ = _Facade
|
|
61
78
|
|
|
@@ -49,6 +49,7 @@ from ._salts import ComponentRow, DEFAULT_STABILIZER_CLASSES, SaltComposition, d
|
|
|
49
49
|
from ._saturate import saturate
|
|
50
50
|
from ._smarts import SmartsSyntaxError, compile_smarts
|
|
51
51
|
from ._standardize import LogRecord, standardize
|
|
52
|
+
from ._stereo_audit import Fix, Finding, StereoAudit, audit_stereo
|
|
52
53
|
from ._tables import (ACID_ROLES, AbbreviationRow, AcidRow, Endpoint, RESONANCE_ROLES, Rule,
|
|
53
54
|
SALT_CLASSES, SALT_MATCHES, SaltRow, abbreviation_row, abbreviations_rows,
|
|
54
55
|
acids_rules, acids_rules_by_role, acids_table_text, groups_rules,
|
|
@@ -56,6 +57,7 @@ from ._tables import (ACID_ROLES, AbbreviationRow, AcidRow, Endpoint, RESONANCE_
|
|
|
56
57
|
resonance_table_text, salts_rows, salts_rows_by_klass, salts_species_keys,
|
|
57
58
|
salts_table_text, standardize_rules)
|
|
58
59
|
from ._tpsa import tpsa
|
|
60
|
+
from ..core.monomers import PeptideBranch, Peptide, Residue, monomers
|
|
59
61
|
from ..core._core import (_set_canonicalize_fn, _set_featurizer_fns, _set_hydrogens_fns,
|
|
60
62
|
_set_isomers_fn, _set_kekule_form_fn, _set_protomers_fn,
|
|
61
63
|
_set_resonance_fn, _set_salts_fns, _set_standardize_fn,
|
|
@@ -63,13 +65,14 @@ from ..core._core import (_set_canonicalize_fn, _set_featurizer_fns, _set_hydrog
|
|
|
63
65
|
|
|
64
66
|
|
|
65
67
|
__all__ = ['ACID_ROLES', 'AbbreviationRow', 'ComponentRow', 'DEFAULT_STABILIZER_CLASSES',
|
|
66
|
-
'LogRecord', '
|
|
67
|
-
'
|
|
68
|
+
'Finding', 'Fix', 'LogRecord', 'Peptide', 'PeptideBranch', 'Residue',
|
|
69
|
+
'SALT_CLASSES', 'SALT_MATCHES', 'SaltComposition', 'StereoAudit',
|
|
70
|
+
'abbreviation_row', 'abbreviations_rows', 'alert_count', 'audit_stereo',
|
|
68
71
|
'calc_implicit', 'canonicalize', 'check_valence', 'crippen_logp', 'crippen_mr',
|
|
69
72
|
'decompose_salts', 'expand_abbreviations', 'explicify_hydrogens', 'fix_resonance',
|
|
70
73
|
'hydrogen_bond_acceptors_count',
|
|
71
74
|
'hydrogen_bond_donors_count', 'implicify_hydrogens', 'maccs_bit_set', 'maccs_keys',
|
|
72
|
-
'neutralize', 'perceive_bonds', 'pharmacophore_invariants', 'qed', 'qed_properties',
|
|
75
|
+
'monomers', 'neutralize', 'perceive_bonds', 'pharmacophore_invariants', 'qed', 'qed_properties',
|
|
73
76
|
'rotatable_bonds_count',
|
|
74
77
|
'saturate', 'split_salts', 'standardize', 'standardize_isomers',
|
|
75
78
|
'standardize_kekule', 'tpsa']
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"""`canonicalize()` -- the pre-pass that makes `canonical_bytes` a compound identity rather than a
|
|
20
20
|
drawing identity, so equal compounds hash equal and a corpus deduplicates by hash. The stage order
|
|
21
21
|
is a correctness constraint, not taste: `kekule()`, `validate_stereo()`, `standardize()`,
|
|
22
|
-
`implicify_hydrogens()`, `neutralize()`, `standardize_kekule()`, `thiele()`, `standardize_isomers()`,
|
|
23
|
-
`kekule()` again only under `keep_kekule=True`. Each ordering pair
|
|
24
|
-
below.
|
|
22
|
+
`implicify_hydrogens()`, `neutralize()`, `standardize_kekule()`, `thiele()`, `standardize_isomers()`,
|
|
23
|
+
`kekule()` again only under `keep_kekule=True`, and `canonicalize_stereo_groups()`. Each ordering pair
|
|
24
|
+
is justified at its numbered step below.
|
|
25
25
|
|
|
26
26
|
The order alone is not enough, because the last stage can unblock the third one: a `tautomer` row
|
|
27
27
|
wanting a free ring nitrogen cannot fire while the mobile hydrogen sits on it, and the placement is
|
|
@@ -48,8 +48,46 @@ _RULE_ROUNDS = 'canonicalize:rounds'
|
|
|
48
48
|
_ROUNDS_MAX = 5
|
|
49
49
|
|
|
50
50
|
|
|
51
|
+
def _pin_lactim(molecule: MoleculeContainer) -> bool:
|
|
52
|
+
"""Kekulise `molecule` with the C=N of one aromatic lactim pinned, when that lets a row repair it.
|
|
53
|
+
|
|
54
|
+
A site is `[O,S;D1]-c:n` with a bare two-connected ring nitrogen. Sites are tried in `atoms_order`,
|
|
55
|
+
which the placement stage has already made spelling-independent, and a site is taken only when a
|
|
56
|
+
trial `standardize()` on the pinned form turns its C-OH into C=O -- the rows stay the only authority
|
|
57
|
+
on which lactims are lactams. Returns True with the molecule kekulised and the repair still to run.
|
|
58
|
+
"""
|
|
59
|
+
ranks = molecule.atoms_order
|
|
60
|
+
sites = []
|
|
61
|
+
for o in molecule.atom_numbers:
|
|
62
|
+
if molecule.element_of(o) not in (8, 16) or molecule.charge_of(o) or molecule.implicit_h_of(o) != 1:
|
|
63
|
+
continue
|
|
64
|
+
neighbors = tuple(molecule.neighbors_of(o))
|
|
65
|
+
if len(neighbors) != 1 or molecule.order_of(o, neighbors[0]) != 1:
|
|
66
|
+
continue
|
|
67
|
+
c = neighbors[0]
|
|
68
|
+
for n in molecule.neighbors_of(c):
|
|
69
|
+
if (molecule.element_of(n) == 7 and molecule.order_of(c, n) == 4 and not molecule.charge_of(n)
|
|
70
|
+
and not molecule.implicit_h_of(n) and len(tuple(molecule.neighbors_of(n))) == 2):
|
|
71
|
+
sites.append((ranks[o], ranks[n], o, c, n))
|
|
72
|
+
for *_, o, c, n in sorted(sites):
|
|
73
|
+
trial = molecule.copy()
|
|
74
|
+
with trial.edit():
|
|
75
|
+
trial.set_order(c, n, 2)
|
|
76
|
+
if trial.kekule(canonical=True).unresolved or trial.order_of(c, n) != 2:
|
|
77
|
+
continue
|
|
78
|
+
standardize(trial)
|
|
79
|
+
if trial.order_of(o, c) != 2:
|
|
80
|
+
continue
|
|
81
|
+
with molecule.edit():
|
|
82
|
+
molecule.set_order(c, n, 2)
|
|
83
|
+
molecule.kekule(canonical=True)
|
|
84
|
+
return True
|
|
85
|
+
return False
|
|
86
|
+
|
|
87
|
+
|
|
51
88
|
def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
|
|
52
|
-
keep_kekule: bool = False
|
|
89
|
+
keep_kekule: bool = False, stereo_groups: bool = True,
|
|
90
|
+
recover_racemate: bool = False) -> bool:
|
|
53
91
|
"""Bring `molecule` to the representation two drawings of one compound share. Did it change?
|
|
54
92
|
|
|
55
93
|
Run before deduplicating by `canonical_bytes`, `__hash__` or `__eq__`, which otherwise answer "same
|
|
@@ -61,7 +99,10 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
|
|
|
61
99
|
(`Oc1ccccn1` and `O=c1cccc[nH]1` stop hashing equal); it deliberately does not reach
|
|
62
100
|
`standardize_isomers()`, which picks between two valid annular forms rather than repairing one.
|
|
63
101
|
`keep_kekule=True` costs a second kekulisation rather than a skipped `thiele()`, the placement stage
|
|
64
|
-
needing the aromatic form.
|
|
102
|
+
needing the aromatic form. `stereo_groups=False` skips step 11 and keeps the stored collection
|
|
103
|
+
labels and AND phases, which a reaction needs for a collection joined across its arrow.
|
|
104
|
+
`recover_racemate` is forwarded to `validate_stereo()`: a bridgehead pair no bicycle realises is then
|
|
105
|
+
read as the racemate instead of cleared.
|
|
65
106
|
|
|
66
107
|
CHARGES ARE PAIRED OFF, not preserved atom by atom: glycine's zwitterion and its neutral drawing
|
|
67
108
|
share a key, because step 5 runs `neutralize()`. `neutralize()` leaves the NET charge untouched, so
|
|
@@ -95,7 +136,11 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
|
|
|
95
136
|
# Nothing is recorded here about `result.unresolved`: the kekuliser writes a `LOST` record per
|
|
96
137
|
# system to `molecule.log` itself, naming it in `atoms`, so a second one here would summarise an
|
|
97
138
|
# event already reported. `check_valence()` is still how those atoms are found.
|
|
98
|
-
|
|
139
|
+
# Canonically, so the group rules see one form of the compound whatever the atom order. A drawing
|
|
140
|
+
# already in a Kekule form is aromatised first, or the rules would read whichever form was drawn:
|
|
141
|
+
# the two Kekule drawings of HBTU's benzotriazole oxide repair to two resonance forms.
|
|
142
|
+
molecule.thiele()
|
|
143
|
+
molecule.kekule(canonical=True)
|
|
99
144
|
|
|
100
145
|
# 2. Drop the parities the constitution does not justify, on the localised form and before step 6
|
|
101
146
|
# hides a bond order behind an aromatic one. A cis/trans sign on a double bond an alternating
|
|
@@ -103,28 +148,34 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
|
|
|
103
148
|
# `canonical_bytes` whether or not the unit is stereogenic -- so the two bond-shift drawings of
|
|
104
149
|
# 1,2-dimethylcyclooctatetraene keep two keys until it is gone. The report is not recorded: the
|
|
105
150
|
# parities it names are the reader's own input and `validate_stereo()` returns them to a caller
|
|
106
|
-
# that wants them.
|
|
107
|
-
|
|
151
|
+
# that wants them. A coupled bridgehead set signed as no bicycle is built is cleared, or with
|
|
152
|
+
# `recover_racemate` read as the racemate its drawer most likely meant.
|
|
153
|
+
molecule.validate_stereo(recover_racemate=recover_racemate)
|
|
108
154
|
|
|
109
|
-
# 3.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
# 4. Explicit hydrogens are a `canonical_bytes` difference, so they have to go.
|
|
155
|
+
# 3. Explicit hydrogens are a `canonical_bytes` difference, so they have to go -- before step 4,
|
|
156
|
+
# whose rows read implicit counts and move no hydrogen atom: `[H]Oc1ccncc1` would flip to the
|
|
157
|
+
# 4-pyridone with its hydrogen atom still on the oxygen.
|
|
113
158
|
implicify_hydrogens(molecule)
|
|
114
159
|
|
|
160
|
+
# 4. Repair the drawing.
|
|
161
|
+
repaired = standardize(molecule, fix_tautomers=fix_tautomers)
|
|
162
|
+
|
|
115
163
|
# 5. Pair off the charges an acid/base row can pair off, so a zwitterion and its neutral drawing
|
|
116
|
-
# hash equal. AFTER step
|
|
164
|
+
# hash equal. AFTER step 3, because `acids.tsv` reads implicit hydrogens: a cation drawn with
|
|
117
165
|
# hydrogen ATOMS is invisible to it until they have been folded in. `keep_charge` stays at its
|
|
118
166
|
# default -- the net charge is part of the compound, so a canonical form may move a proton but
|
|
119
167
|
# never create or destroy one. A quaternary ammonium keeps its counterion: it has no proton to
|
|
120
|
-
# give, so the pass finds no donor and declines.
|
|
121
|
-
|
|
168
|
+
# give, so the pass finds no donor and declines. A repair or a pairing moves bonds and hydrogens
|
|
169
|
+
# step 2 judged, so it is asked again: a parity a moved hydrogen leaves on an alternating cycle
|
|
170
|
+
# would be dropped by the next canonicalisation, and the first answer would not be a fixed point.
|
|
171
|
+
if neutralize(molecule) | repaired:
|
|
172
|
+
molecule.validate_stereo(recover_racemate=recover_racemate)
|
|
122
173
|
|
|
123
174
|
# 6. Which Kekule form, decided before step 7 reads one. `thiele()` refuses a candidate ring whose
|
|
124
175
|
# atom holds its double bond outside the ring, so a compound with several Kekule forms has one
|
|
125
176
|
# aromatic form per form until this stage picks between them; a ring too big for `thiele()` to
|
|
126
177
|
# consider gets a canonical alternation here instead, nothing later collapsing its two. AFTER
|
|
127
|
-
# step
|
|
178
|
+
# step 4, whose group rules are written against the orders the drawing carried, and after step 2,
|
|
128
179
|
# whose parities would otherwise pin the very bond this stage moves.
|
|
129
180
|
standardize_kekule(molecule)
|
|
130
181
|
|
|
@@ -142,32 +193,40 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
|
|
|
142
193
|
|
|
143
194
|
# 9. Steps 3 to 8 again, while the placement keeps unblocking a repair. `Oc1[nH]cnc2nncc1-2` is
|
|
144
195
|
# the shape: its mobile hydrogen sits on the one ring nitrogen the hydroxy-azine rows need free,
|
|
145
|
-
# so step
|
|
196
|
+
# so step 4 declines, and by the time step 8 has moved it the repair is behind us -- the drawing
|
|
146
197
|
# kept its hydroxy form and the same compound drawn the other way got the oxo form and a
|
|
147
198
|
# different key. Only the placement is re-entered from, since it is the one stage that can put
|
|
148
199
|
# the molecule back into a shape an earlier stage would have acted on.
|
|
149
200
|
#
|
|
150
201
|
# `kekule()` leads, and not for the reason step 1 does: the `tautomer` rows are written against
|
|
151
202
|
# definite bond orders, so on the aromatic form step 7 left behind they match nothing at all and
|
|
152
|
-
# re-running step
|
|
153
|
-
#
|
|
203
|
+
# re-running step 4 would be a guaranteed no-op. Step 5 is re-entered every round: a repair and
|
|
204
|
+
# the placement both hand it charged sites it has not seen -- the placement moves an N-oxide's
|
|
205
|
+
# charge onto an azole NH, `c1ccc2[nH]cnc2[n+]1[O-]` to `c1ccc2nc[nH+]c2n1[O-]`, a zwitterion
|
|
206
|
+
# step 5 pairs off -- and what it pairs off can unblock the placement again. It cannot cycle:
|
|
207
|
+
# step 5 only ever reduces the number of charged atoms and step 8 never adds one. Step 6 rides
|
|
154
208
|
# with the aromatisation and not with the repair: the kekulisation above is free to come back with
|
|
155
209
|
# a different Kekule form than the one it was handed, which is the form step 7 would then read.
|
|
156
|
-
# Step 2 is
|
|
157
|
-
#
|
|
210
|
+
# Step 2 is re-entered every round, on the localised form ahead of step 6: the placement moved a
|
|
211
|
+
# hydrogen, and which double bonds an alternating cycle can move depends on where it sits.
|
|
212
|
+
#
|
|
213
|
+
# A round the placement did not ask for is opened by a lactim `kekule()` left unrepairable: the
|
|
214
|
+
# hydroxy-azine rows need the C=N beside the C-OH, and which Kekule form comes back depends on the
|
|
215
|
+
# atom order. `_pin_lactim` pins that C=N and kekulises around it, so 3-hydroxyisoquinoline
|
|
216
|
+
# reaches isoquinolin-3(2H)-one from every order.
|
|
158
217
|
for _ in range(_ROUNDS_MAX):
|
|
159
|
-
if
|
|
218
|
+
if moved:
|
|
219
|
+
molecule.kekule(canonical=True)
|
|
220
|
+
elif not (fix_tautomers and _pin_lactim(molecule)):
|
|
160
221
|
break
|
|
161
|
-
molecule.kekule()
|
|
162
222
|
changed = standardize(molecule, fix_tautomers=fix_tautomers)
|
|
163
223
|
if changed:
|
|
164
224
|
implicify_hydrogens(molecule)
|
|
165
|
-
|
|
225
|
+
changed |= neutralize(molecule)
|
|
226
|
+
molecule.validate_stereo(recover_racemate=recover_racemate) # the placement moved a hydrogen
|
|
166
227
|
standardize_kekule(molecule)
|
|
167
228
|
molecule.thiele() # unconditional: step 6's form is what a caller compares, and
|
|
168
|
-
|
|
169
|
-
break
|
|
170
|
-
moved = standardize_isomers(molecule)
|
|
229
|
+
moved = changed and standardize_isomers(molecule) # the kekulisation has to be undone either way
|
|
171
230
|
else:
|
|
172
231
|
with recording(molecule, stage='canonicalize') as log:
|
|
173
232
|
log.append(LogRecord(_RULE_ROUNDS, (), f'repair and placement were still changing the '
|
|
@@ -178,8 +237,14 @@ def canonicalize(molecule: MoleculeContainer, *, fix_tautomers: bool = True,
|
|
|
178
237
|
# 10. `keep_kekule` undoes step 7 rather than skipping it: skipping 7 would skip 8 with it, and the
|
|
179
238
|
# flag would then decide which tautomer the caller gets. Step 6 is not re-run behind it and
|
|
180
239
|
# would have nothing to do: an aromatic ring is unwound into a ring holding every double bond it
|
|
181
|
-
# has room for, and which of its alternations comes back is the kekuliser's answer to give
|
|
240
|
+
# has room for, and which of its alternations comes back is the kekuliser's answer to give --
|
|
241
|
+
# canonical, so the flag keeps the guarantee.
|
|
182
242
|
if keep_kekule:
|
|
183
|
-
molecule.kekule()
|
|
243
|
+
molecule.kekule(canonical=True)
|
|
244
|
+
|
|
245
|
+
# 11. Store the collections the canonical SMILES states: dead labels dropped, canonical ids, each AND
|
|
246
|
+
# collection in its canonical phase. Last, because every stage above can move a parity or a
|
|
247
|
+
# unit. `canonical_bytes` does not see it, so its answer is ORed in.
|
|
248
|
+
grouped = stereo_groups and molecule.canonicalize_stereo_groups()
|
|
184
249
|
|
|
185
|
-
return molecule.canonical_bytes != before
|
|
250
|
+
return molecule.canonical_bytes != before or grouped
|
|
@@ -92,13 +92,31 @@ def _plan(molecule: MoleculeContainer, log):
|
|
|
92
92
|
doomed.append(n)
|
|
93
93
|
counts[other] = current + 1
|
|
94
94
|
|
|
95
|
-
# Read every affected anchor's
|
|
96
|
-
#
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
95
|
+
# Read every affected anchor's configuration now, in a direction order that already puts each doomed
|
|
96
|
+
# hydrogen where the implicit direction will be: last in its group, the whole frame for a centre and
|
|
97
|
+
# its own pair for a bond unit. `delete_atom` clears the parity, and the unit's refs after the fold
|
|
98
|
+
# are not the refs before it, so a verbatim copy of the byte inverts the centre whenever the move is
|
|
99
|
+
# an odd permutation -- `[2H][C@@]([H])(Cl)Br` folded to the enantiomer of `[H][C@]([2H])(Cl)Br`.
|
|
100
|
+
gone = frozenset(doomed)
|
|
101
|
+
parities: dict[int, tuple[int, tuple]] = {}
|
|
102
|
+
for u in molecule.stereo_units():
|
|
103
|
+
n = u['anchor']
|
|
104
|
+
if n not in counts or not molecule.parity_of(n):
|
|
105
|
+
continue
|
|
106
|
+
refs = u['refs']
|
|
107
|
+
groups = [refs] if u['kind'] == 0 else [refs[:2], refs[2:]]
|
|
108
|
+
before, after = [], []
|
|
109
|
+
for group in groups:
|
|
110
|
+
kept = [r for r in group if r not in gone]
|
|
111
|
+
dropped = [r for r in group if r in gone]
|
|
112
|
+
before.extend(kept + dropped)
|
|
113
|
+
after.extend(kept + [None] * len(dropped))
|
|
114
|
+
if sum(r is None for r in after) > 1:
|
|
115
|
+
continue # two unnamed directions: no configuration survives the fold
|
|
116
|
+
try:
|
|
117
|
+
parities[n] = (molecule.translate_stereo(n, tuple(before)), tuple(after))
|
|
118
|
+
except ValueError: # a kind whose refs are not read in these groups: as stored
|
|
119
|
+
parities[n] = (molecule.parity_of(n), None)
|
|
102
120
|
return doomed, counts, parities
|
|
103
121
|
|
|
104
122
|
|
|
@@ -129,10 +147,12 @@ def _implicify_apply(molecule, doomed, counts, parities):
|
|
|
129
147
|
molecule.delete_atom(n)
|
|
130
148
|
for n, total in counts.items():
|
|
131
149
|
molecule.set_hydrogens(n, total)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
150
|
+
if parities:
|
|
151
|
+
# restore what `delete_atom` cleared, in the order `_plan` read it: a second session, since
|
|
152
|
+
# `order=` reads the frame and the first one changed the graph
|
|
153
|
+
with molecule.edit():
|
|
154
|
+
for n, (p, order) in parities.items():
|
|
155
|
+
molecule.set_parity(n, p, order=order)
|
|
136
156
|
|
|
137
157
|
|
|
138
158
|
def explicify_hydrogens(molecule: MoleculeContainer) -> int:
|