synkit 1.3.1a0__tar.gz → 1.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. {synkit-1.3.1a0 → synkit-1.3.2}/.gitignore +5 -1
  2. {synkit-1.3.1a0 → synkit-1.3.2}/PKG-INFO +1 -1
  3. {synkit-1.3.1a0 → synkit-1.3.2}/pyproject.toml +1 -1
  4. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Query/kegg_parse.py +1 -1
  5. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Molecule/atom_features.py +0 -1
  6. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/standardize.py +56 -8
  7. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/mol_to_graph.py +67 -38
  8. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/rbl_engine.py +1 -1
  9. synkit-1.3.2/synkit/Vis/rxn_vis.py +532 -0
  10. synkit-1.3.1a0/synkit/Vis/rxn_vis.py +0 -159
  11. {synkit-1.3.1a0 → synkit-1.3.2}/LICENSE +0 -0
  12. {synkit-1.3.1a0 → synkit-1.3.2}/README.md +0 -0
  13. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/DAG/__init__.py +0 -0
  14. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/DAG/crn.py +0 -0
  15. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/DAG/mod_crn.py +0 -0
  16. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/DAG/syncrn.py +0 -0
  17. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/__init__.py +0 -0
  18. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/abstract.py +0 -0
  19. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/arity.py +0 -0
  20. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/builder.py +0 -0
  21. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/derivation.py +0 -0
  22. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/flattener.py +0 -0
  23. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/keys.py +0 -0
  24. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/mixtures.py +0 -0
  25. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/smiles.py +0 -0
  26. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/state.py +0 -0
  27. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/strategy.py +0 -0
  28. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Construct/worker.py +0 -0
  29. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Pathway/__init__.py +0 -0
  30. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Pathway/_adapter.py +0 -0
  31. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Pathway/pathfinder.py +0 -0
  32. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Pathway/reachability.py +0 -0
  33. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Pathway/realizability.py +0 -0
  34. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Petrinet/__init__.py +0 -0
  35. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Petrinet/analyzer.py +0 -0
  36. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Petrinet/net.py +0 -0
  37. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Petrinet/persistence.py +0 -0
  38. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Petrinet/semiflows.py +0 -0
  39. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Petrinet/structure.py +0 -0
  40. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Props/__init__.py +0 -0
  41. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Props/dynamics.py +0 -0
  42. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Props/helper.py +0 -0
  43. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Props/stoich.py +0 -0
  44. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Props/thermo.py +0 -0
  45. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Query/__init__.py +0 -0
  46. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Query/kegg_api.py +0 -0
  47. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Query/kegg_extract.py +0 -0
  48. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Query/kegg_impute.py +0 -0
  49. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Structure/__init__.py +0 -0
  50. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Structure/reaction.py +0 -0
  51. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Structure/rule.py +0 -0
  52. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Structure/species.py +0 -0
  53. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Structure/syncrn.py +0 -0
  54. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Symmetry/__init__.py +0 -0
  55. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Symmetry/_common.py +0 -0
  56. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Symmetry/_ir.py +0 -0
  57. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Symmetry/automorphism.py +0 -0
  58. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Symmetry/canon.py +0 -0
  59. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Symmetry/isomorphism.py +0 -0
  60. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Symmetry/symmetry.py +0 -0
  61. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Symmetry/wl_canon.py +0 -0
  62. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Visualize/__init__.py +0 -0
  63. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Visualize/crn_vis.py +0 -0
  64. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Visualize/labels.py +0 -0
  65. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Visualize/layout.py +0 -0
  66. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Visualize/palette.py +0 -0
  67. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Visualize/validation.py +0 -0
  68. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/Visualize/vis.py +0 -0
  69. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/__init__.py +0 -0
  70. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Structure/__init__.py +0 -0
  71. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Structure/backend.py +0 -0
  72. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Structure/conversion.py +0 -0
  73. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Structure/hyperedge.py +0 -0
  74. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Structure/hypergraph.py +0 -0
  75. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Structure/rxn.py +0 -0
  76. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Symmetry/__init__.py +0 -0
  77. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Symmetry/automorphism.py +0 -0
  78. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Symmetry/canon.py +0 -0
  79. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/Symmetry/wl_canon.py +0 -0
  80. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/__init__.py +0 -0
  81. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/configs/__init__.py +0 -0
  82. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/configs/loader.py +0 -0
  83. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/configs/models.py +0 -0
  84. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/constants.py +0 -0
  85. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/crn_formula.py +0 -0
  86. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/deficiency.py +0 -0
  87. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/enumerator.py +0 -0
  88. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/exceptions.py +0 -0
  89. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/explorer.py +0 -0
  90. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/helpers.py +0 -0
  91. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/injectivity.py +0 -0
  92. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/motif.py +0 -0
  93. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/network.py +0 -0
  94. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/pathway.py +0 -0
  95. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/properties.py +0 -0
  96. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/reaction.py +0 -0
  97. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/utils.py +0 -0
  98. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/CRN/dev_crn/viz.py +0 -0
  99. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Cluster/__init__.py +0 -0
  100. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Cluster/butina.py +0 -0
  101. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Fingerprint/__init__.py +0 -0
  102. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Fingerprint/fp_calculator.py +0 -0
  103. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Fingerprint/smiles_featurizer.py +0 -0
  104. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Fingerprint/transformation_fp.py +0 -0
  105. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Molecule/__init__.py +0 -0
  106. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Molecule/descriptors.py +0 -0
  107. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Molecule/formula.py +0 -0
  108. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Molecule/graph_annotator.py +0 -0
  109. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Molecule/standardize.py +0 -0
  110. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Molecule/valence.py +0 -0
  111. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/Mapper/__init__.py +0 -0
  112. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/Mapper/wl_mapper.py +0 -0
  113. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/__init__.py +0 -0
  114. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/aam_validator.py +0 -0
  115. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/balance_check.py +0 -0
  116. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/canon_rsmi.py +0 -0
  117. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/cleaning.py +0 -0
  118. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/deionize.py +0 -0
  119. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/fix_aam.py +0 -0
  120. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/neutralize.py +0 -0
  121. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/radical_wildcard.py +0 -0
  122. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/Reaction/tautomerize.py +0 -0
  123. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/__init__.py +0 -0
  124. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Chem/utils.py +0 -0
  125. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Data/__init__.py +0 -0
  126. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Data/gen_partial_aam.py +0 -0
  127. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Canon/__init__.py +0 -0
  128. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Canon/canon_algs.py +0 -0
  129. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Canon/canon_graph.py +0 -0
  130. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Canon/nauty.py +0 -0
  131. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Context/__init__.py +0 -0
  132. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Context/hier_context.py +0 -0
  133. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Context/radius_expand.py +0 -0
  134. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/Descriptors/topology.py +0 -0
  135. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
  136. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +0 -0
  137. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/__init__.py +0 -0
  138. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/graph_descriptors.py +0 -0
  139. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/graph_fps.py +0 -0
  140. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/graph_signature.py +0 -0
  141. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/hash_fps.py +0 -0
  142. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/morgan_fps.py +0 -0
  143. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/path_fps.py +0 -0
  144. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Feature/wl_hash.py +0 -0
  145. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Hyrogen/__init__.py +0 -0
  146. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Hyrogen/_misc.py +0 -0
  147. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Hyrogen/hcomplete.py +0 -0
  148. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Hyrogen/hextend.py +0 -0
  149. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/__init__.py +0 -0
  150. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/its_builder.py +0 -0
  151. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/its_construction.py +0 -0
  152. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/its_decompose.py +0 -0
  153. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/its_destruction.py +0 -0
  154. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/its_expand.py +0 -0
  155. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/its_relabel.py +0 -0
  156. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/its_reverter.py +0 -0
  157. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/normalize_aam.py +0 -0
  158. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/partial_its.py +0 -0
  159. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/ITS/rc_extractor.py +0 -0
  160. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/MTG/__init__.py +0 -0
  161. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/MTG/group_comp.py +0 -0
  162. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/MTG/groupoid.py +0 -0
  163. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/MTG/mcs_matcher.py +0 -0
  164. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/MTG/mtg.py +0 -0
  165. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/MTG/mtg_explore.py +0 -0
  166. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/MTG/utils.py +0 -0
  167. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/__init__.py +0 -0
  168. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/approx_mcs.py +0 -0
  169. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/auto_est.py +0 -0
  170. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/automorphism.py +0 -0
  171. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/batch_cluster.py +0 -0
  172. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/dedup_matches.py +0 -0
  173. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/graph_cluster.py +0 -0
  174. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/graph_matcher.py +0 -0
  175. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/graph_morphism.py +0 -0
  176. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/mcs_matcher.py +0 -0
  177. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/multi_turbo_iso.py +0 -0
  178. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/orbit.py +0 -0
  179. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/partial_matcher.py +0 -0
  180. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/sing.py +0 -0
  181. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/subgraph_matcher.py +0 -0
  182. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/turbo_iso.py +0 -0
  183. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Matcher/wl_sel.py +0 -0
  184. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Wildcard/__init__.py +0 -0
  185. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Wildcard/fuse_graph.py +0 -0
  186. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Wildcard/graph_wc.py +0 -0
  187. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Wildcard/its_merge.py +0 -0
  188. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Wildcard/radwc.py +0 -0
  189. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Wildcard/wc_matcher.py +0 -0
  190. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/Wildcard/wildcard.py +0 -0
  191. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/__init__.py +0 -0
  192. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/canon_graph.py +0 -0
  193. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/syn_graph.py +0 -0
  194. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Graph/utils.py +0 -0
  195. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/__init__.py +0 -0
  196. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/chem_converter.py +0 -0
  197. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/combinatorial/__init__.py +0 -0
  198. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/combinatorial/gml_to_graph.py +0 -0
  199. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/combinatorial/graph_to_gml.py +0 -0
  200. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/combinatorial/graph_to_smarts.py +0 -0
  201. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/combinatorial/smarts_expander.py +0 -0
  202. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/combinatorial/smarts_generalizer.py +0 -0
  203. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/combinatorial/smarts_to_graph.py +0 -0
  204. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/data_io.py +0 -0
  205. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/data_process.py +0 -0
  206. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/debug.py +0 -0
  207. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/dg_to_gml.py +0 -0
  208. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/gml_to_nx.py +0 -0
  209. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/graph_to_mol.py +0 -0
  210. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/nx_to_gml.py +0 -0
  211. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/IO/smiles_to_id.py +0 -0
  212. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Apply/__init__.py +0 -0
  213. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Apply/reactor_rule.py +0 -0
  214. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Apply/retro_reactor.py +0 -0
  215. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Apply/rule_matcher.py +0 -0
  216. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Apply/rule_rbl.py +0 -0
  217. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Compose/__init__.py +0 -0
  218. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Compose/compose_rule.py +0 -0
  219. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Compose/rule_compose.py +0 -0
  220. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Compose/rule_mapping.py +0 -0
  221. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Compose/seq_comp.py +0 -0
  222. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Compose/valence_constrain.py +0 -0
  223. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Modify/__init__.py +0 -0
  224. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Modify/implict_rule.py +0 -0
  225. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Modify/longest_path.py +0 -0
  226. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Modify/molecule_rule.py +0 -0
  227. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Modify/prune_templates.py +0 -0
  228. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Modify/rule_utils.py +0 -0
  229. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/Modify/strip_rule.py +0 -0
  230. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/__init__.py +0 -0
  231. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Rule/syn_rule.py +0 -0
  232. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/MSR/__init__.py +0 -0
  233. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/MSR/multi_steps.py +0 -0
  234. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/MSR/path_finder.py +0 -0
  235. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Metrics/__init__.py +0 -0
  236. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Metrics/_base.py +0 -0
  237. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Metrics/_plot.py +0 -0
  238. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Metrics/_ranking.py +0 -0
  239. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/__init__.py +0 -0
  240. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/batch_reactor.py +0 -0
  241. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/benchmark.py +0 -0
  242. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/imba_engine.py +0 -0
  243. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/mod_aam.py +0 -0
  244. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/mod_reactor.py +0 -0
  245. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/partial_engine.py +0 -0
  246. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/post_syn.py +0 -0
  247. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/rule_filter.py +0 -0
  248. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/single_predictor.py +0 -0
  249. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/strategy.py +0 -0
  250. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/Reactor/syn_reactor.py +0 -0
  251. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/__init__.py +0 -0
  252. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Synthesis/reactor_utils.py +0 -0
  253. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Utils/__init__.py +0 -0
  254. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Utils/utils.py +0 -0
  255. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Vis/__init__.py +0 -0
  256. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Vis/chemical_space.py +0 -0
  257. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Vis/crn_vis.py +0 -0
  258. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Vis/embedding.py +0 -0
  259. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Vis/graph_visualizer.py +0 -0
  260. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Vis/pdf_writer.py +0 -0
  261. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/Vis/rule_vis.py +0 -0
  262. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/__init__.py +0 -0
  263. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/examples.py +0 -0
  264. {synkit-1.3.1a0 → synkit-1.3.2}/synkit/version.py +0 -0
@@ -27,4 +27,8 @@ crn/*
27
27
  test_run.py
28
28
  Data/Study/CRN/case_formose/*
29
29
 
30
- synkit/Graph/dev/*
30
+ synkit/Graph/dev/*
31
+ *.ipynb
32
+ *.json
33
+ *.txt
34
+ *.log
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synkit
3
- Version: 1.3.1a0
3
+ Version: 1.3.2
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "synkit"
7
- version = "1.3.1a"
7
+ version = "1.3.2"
8
8
  description = "Utility for reaction modeling using graph grammar"
9
9
  readme = "README.md"
10
10
  long-description = { file = "CHANGELOG.md" }
@@ -426,7 +426,7 @@ def parse_module_reaction_directions(
426
426
  in_reaction = False
427
427
  for line in text.splitlines():
428
428
  if line.startswith("REACTION"):
429
- payload = line[len("REACTION"):].strip()
429
+ payload = line[len("REACTION") :].strip() # noqa
430
430
  in_reaction = True
431
431
  elif in_reaction and (line.startswith(" ") or line.startswith("\t")):
432
432
  payload = line.strip()
@@ -192,7 +192,6 @@ class AtomFeatureExtractor:
192
192
  "partial_charge": round(float(gcharge), 3),
193
193
  "hybridization": str(atom.GetHybridization()),
194
194
  "in_ring": bool(atom.IsInRing()),
195
- "implicit_hcount": int(atom.GetNumImplicitHs()),
196
195
  "neighbors": neighbor_symbols,
197
196
  "atom_map": atom_map,
198
197
  }
@@ -72,7 +72,34 @@ class Standardize:
72
72
  return valid
73
73
 
74
74
  @staticmethod
75
- def standardize_rsmi(rsmi: str, stereo: bool = False) -> Optional[str]:
75
+ def _parse_molecule_fragments(
76
+ smiles_list: List[str],
77
+ ) -> Tuple[List[Chem.Mol], bool]:
78
+ """Parse and sanitize SMILES fragments.
79
+
80
+ :param smiles_list: List of SMILES strings to validate.
81
+ :type smiles_list: List[str]
82
+ :returns: Tuple of valid molecules and whether any fragment was invalid.
83
+ :rtype: Tuple[List[rdkit.Chem.Mol], bool]
84
+ """
85
+ valid: List[Chem.Mol] = []
86
+ had_invalid = False
87
+ for smi in smiles_list:
88
+ mol = Chem.MolFromSmiles(smi, sanitize=False)
89
+ if mol:
90
+ try:
91
+ Chem.SanitizeMol(mol)
92
+ valid.append(mol)
93
+ except Exception:
94
+ had_invalid = True
95
+ else:
96
+ had_invalid = True
97
+ return valid, had_invalid
98
+
99
+ @staticmethod
100
+ def standardize_rsmi(
101
+ rsmi: str, stereo: bool = False, remove_invalid: bool = True
102
+ ) -> Optional[str]:
76
103
  """
77
104
  Normalize a reaction SMILES: validate molecules, sort fragments, optionally keep stereo.
78
105
 
@@ -80,6 +107,10 @@ class Standardize:
80
107
  :type rsmi: str
81
108
  :param stereo: If True, include stereochemistry in the output. Defaults to False.
82
109
  :type stereo: bool
110
+ :param remove_invalid: If True, drop invalid fragments and standardize
111
+ remaining molecules. If False, return None when any invalid fragment
112
+ exists. Defaults to True.
113
+ :type remove_invalid: bool
83
114
  :returns: Standardized reaction SMILES or None if no valid molecules remain.
84
115
  :rtype: Optional[str]
85
116
  :raises ValueError: If the input format is invalid.
@@ -91,8 +122,15 @@ class Standardize:
91
122
  "Invalid reaction SMILES format. Expected 'reactants>>products'."
92
123
  )
93
124
 
94
- react_mols = Standardize.filter_valid_molecules(react_str.split("."))
95
- prod_mols = Standardize.filter_valid_molecules(prod_str.split("."))
125
+ react_mols, react_invalid = Standardize._parse_molecule_fragments(
126
+ react_str.split(".")
127
+ )
128
+ prod_mols, prod_invalid = Standardize._parse_molecule_fragments(
129
+ prod_str.split(".")
130
+ )
131
+
132
+ if not remove_invalid and (react_invalid or prod_invalid):
133
+ return None
96
134
 
97
135
  if not react_mols or not prod_mols:
98
136
  return None
@@ -107,7 +145,11 @@ class Standardize:
107
145
  return f"{sorted_react}>>{sorted_prod}"
108
146
 
109
147
  def fit(
110
- self, rsmi: str, remove_aam: bool = True, ignore_stereo: bool = True
148
+ self,
149
+ rsmi: str,
150
+ remove_aam: bool = True,
151
+ ignore_stereo: bool = True,
152
+ remove_invalid: bool = True,
111
153
  ) -> Optional[str]:
112
154
  """
113
155
  Full standardization pipeline: strip atom‑mapping, normalize SMILES, fix hydrogen notation.
@@ -118,16 +160,22 @@ class Standardize:
118
160
  :type remove_aam: bool
119
161
  :param ignore_stereo: If True, drop stereochemistry. Defaults to True.
120
162
  :type ignore_stereo: bool
163
+ :param remove_invalid: If True, drop invalid fragments and standardize
164
+ remaining molecules. If False, return None when any invalid fragment
165
+ exists. Defaults to True.
166
+ :type remove_invalid: bool
121
167
  :returns: The standardized reaction SMILES, or None if standardization fails.
122
168
  :rtype: Optional[str]
123
169
  """
124
- if remove_aam:
125
- rsmi = self.remove_atom_mapping(rsmi)
126
-
127
- std = self.standardize_rsmi(rsmi, stereo=not ignore_stereo)
170
+ std = self.standardize_rsmi(
171
+ rsmi, stereo=not ignore_stereo, remove_invalid=remove_invalid
172
+ )
128
173
  if std is None:
129
174
  return None
130
175
 
176
+ if remove_aam:
177
+ std = self.remove_atom_mapping(std)
178
+
131
179
  # Format any double‑hydrogen notation
132
180
  return std.replace("[HH]", "[H][H]")
133
181
 
@@ -46,7 +46,7 @@ class MolToGraph:
46
46
  .. code-block:: python
47
47
 
48
48
  from rdkit import Chem
49
- from synkit.Chem.Molecule.mol_to_graph import MolToGraph
49
+ from synkit.IO.mol_to_graph import MolToGraph
50
50
 
51
51
  mol = Chem.MolFromSmiles("c1cc[nH]c1")
52
52
  graph = MolToGraph(attr_profile="minimal").transform(mol)
@@ -199,6 +199,7 @@ class MolToGraph:
199
199
  atom,
200
200
  props,
201
201
  oxidation_state=oxidation_states.get(atom.GetIdx()),
202
+ profile=self.attr_profile,
202
203
  )
203
204
  except Exception as exc:
204
205
  logger.debug(
@@ -209,6 +210,7 @@ class MolToGraph:
209
210
  props = self._gather_atom_properties(
210
211
  atom,
211
212
  oxidation_state=oxidation_states.get(atom.GetIdx()),
213
+ profile=self.attr_profile,
212
214
  )
213
215
 
214
216
  if self.node_attrs is not None:
@@ -899,55 +901,78 @@ class MolToGraph:
899
901
  atom: Chem.Atom,
900
902
  props: Dict[str, Any],
901
903
  oxidation_state: Optional[float] = None,
904
+ *,
905
+ profile: str = "full",
902
906
  ) -> Dict[str, Any]:
903
- """Add corrected electron-bookkeeping fields.
907
+ """Add electron-bookkeeping fields to existing atom attributes.
908
+
909
+ For both profiles sets ``oxidation_state``, ``radical``,
910
+ ``available_lp``, and the backward-compatible ``lone_pairs`` alias.
911
+ The ``"full"`` profile additionally sets ``bond_order_sum``,
912
+ ``lp_bond_order_sum``, ``valence_electrons``,
913
+ ``estimated_lone_pairs``, and ``available_lone_pairs``.
904
914
 
905
915
  :param atom: RDKit atom.
906
916
  :type atom: Chem.Atom
907
- :param props: Existing atom attributes.
917
+ :param props: Existing atom attributes from
918
+ :class:`~synkit.Chem.Molecule.atom_features.AtomFeatureExtractor`.
908
919
  :type props: Dict[str, Any]
909
- :param oxidation_state: Optional oxidation state.
920
+ :param oxidation_state: Pre-computed oxidation state, or ``None``.
910
921
  :type oxidation_state: Optional[float]
911
- :returns: Augmented atom attributes.
922
+ :param profile: Feature profile — ``"minimal"`` or ``"full"``.
923
+ :type profile: str
924
+ :returns: Augmented atom attributes dict.
912
925
  :rtype: Dict[str, Any]
913
926
  """
914
927
  new_props = dict(props)
915
928
 
916
- raw_bond_order_sum = cls._safe_bond_order_sum(atom)
917
- lp_bond_order_sum = cls._bond_order_sum_for_lone_pairs(atom)
918
- valence_electrons = cls._safe_valence_electrons(atom)
919
-
920
929
  estimated_lone_pairs = cls.estimate_lone_pairs(atom)
921
930
  available_lone_pairs = cls.estimate_available_lone_pairs(atom)
922
931
 
923
- new_props["bond_order_sum"] = round(raw_bond_order_sum, 3)
924
- new_props["lp_bond_order_sum"] = round(lp_bond_order_sum, 3)
925
- new_props["valence_electrons"] = valence_electrons
926
932
  new_props["oxidation_state"] = (
927
933
  None if oxidation_state is None else round(float(oxidation_state), 3)
928
934
  )
929
-
930
- new_props["estimated_lone_pairs"] = estimated_lone_pairs
931
- new_props["available_lone_pairs"] = available_lone_pairs
935
+ new_props["radical"] = int(atom.GetNumRadicalElectrons())
932
936
  new_props["available_lp"] = available_lone_pairs > 0
933
-
934
937
  # Backward-compatible field used by SynEltra.
935
938
  new_props["lone_pairs"] = estimated_lone_pairs
936
939
 
940
+ if profile == "full":
941
+ new_props["bond_order_sum"] = round(cls._safe_bond_order_sum(atom), 3)
942
+ new_props["lp_bond_order_sum"] = round(
943
+ cls._bond_order_sum_for_lone_pairs(atom), 3
944
+ )
945
+ new_props["valence_electrons"] = cls._safe_valence_electrons(atom)
946
+ new_props["estimated_lone_pairs"] = estimated_lone_pairs
947
+ new_props["available_lone_pairs"] = available_lone_pairs
948
+
937
949
  return new_props
938
950
 
939
951
  @staticmethod
940
952
  def _gather_atom_properties(
941
953
  atom: Chem.Atom,
942
954
  oxidation_state: Optional[float] = None,
955
+ *,
956
+ profile: str = "full",
943
957
  ) -> Dict[str, Any]:
944
958
  """Collect fallback atom-level node attributes.
945
959
 
960
+ Minimal profile keys: ``element``, ``aromatic``, ``hcount``,
961
+ ``charge``, ``radical``, ``isomer``, ``partial_charge``,
962
+ ``hybridization``, ``in_ring``, ``neighbors``, ``atom_map``,
963
+ ``oxidation_state``, ``available_lp``, ``lone_pairs``.
964
+
965
+ Full profile additionally includes ``bond_order_sum``,
966
+ ``lp_bond_order_sum``, ``valence_electrons``,
967
+ ``estimated_lone_pairs``, ``available_lone_pairs``.
968
+
946
969
  :param atom: RDKit atom.
947
970
  :type atom: Chem.Atom
948
- :param oxidation_state: Optional oxidation state.
971
+ :param oxidation_state: Pre-computed oxidation state, or ``None``.
949
972
  :type oxidation_state: Optional[float]
950
- :returns: Node attributes.
973
+ :param profile: Feature profile — ``"minimal"`` or ``"full"``.
974
+ :type profile: str
975
+ :returns: Node attribute dict.
951
976
  :rtype: Dict[str, Any]
952
977
  """
953
978
  try:
@@ -965,14 +990,10 @@ class MolToGraph:
965
990
  neighbors = []
966
991
 
967
992
  atom_map = MolToGraph._safe_atom_map(atom)
968
-
969
- raw_bond_order_sum = round(MolToGraph._safe_bond_order_sum(atom), 3)
970
- lp_bond_order_sum = round(MolToGraph._bond_order_sum_for_lone_pairs(atom), 3)
971
- valence_electrons = MolToGraph._safe_valence_electrons(atom)
972
993
  estimated_lone_pairs = MolToGraph.estimate_lone_pairs(atom)
973
994
  available_lone_pairs = MolToGraph.estimate_available_lone_pairs(atom)
974
995
 
975
- return {
996
+ props: Dict[str, Any] = {
976
997
  "element": atom.GetSymbol(),
977
998
  "aromatic": atom.GetIsAromatic(),
978
999
  "hcount": atom.GetTotalNumHs(),
@@ -982,21 +1003,26 @@ class MolToGraph:
982
1003
  "partial_charge": gcharge,
983
1004
  "hybridization": str(atom.GetHybridization()),
984
1005
  "in_ring": atom.IsInRing(),
985
- "implicit_hcount": atom.GetNumImplicitHs(),
986
1006
  "neighbors": neighbors,
987
1007
  "atom_map": atom_map,
988
- "bond_order_sum": raw_bond_order_sum,
989
- "lp_bond_order_sum": lp_bond_order_sum,
990
- "valence_electrons": valence_electrons,
991
1008
  "oxidation_state": (
992
1009
  None if oxidation_state is None else round(float(oxidation_state), 3)
993
1010
  ),
994
- "estimated_lone_pairs": estimated_lone_pairs,
995
- "available_lone_pairs": available_lone_pairs,
996
1011
  "available_lp": available_lone_pairs > 0,
997
1012
  "lone_pairs": estimated_lone_pairs,
998
1013
  }
999
1014
 
1015
+ if profile == "full":
1016
+ props["bond_order_sum"] = round(MolToGraph._safe_bond_order_sum(atom), 3)
1017
+ props["lp_bond_order_sum"] = round(
1018
+ MolToGraph._bond_order_sum_for_lone_pairs(atom), 3
1019
+ )
1020
+ props["valence_electrons"] = MolToGraph._safe_valence_electrons(atom)
1021
+ props["estimated_lone_pairs"] = estimated_lone_pairs
1022
+ props["available_lone_pairs"] = available_lone_pairs
1023
+
1024
+ return props
1025
+
1000
1026
  @staticmethod
1001
1027
  def _gather_bond_properties(
1002
1028
  bond: Chem.Bond,
@@ -1197,11 +1223,18 @@ class MolToGraph:
1197
1223
  ) -> nx.Graph:
1198
1224
  """Create a lightweight graph with corrected lone-pair fields.
1199
1225
 
1226
+ Node attributes: ``element``, ``aromatic``, ``hcount``, ``charge``,
1227
+ ``radical``, ``neighbors``, ``atom_map``, ``oxidation_state``,
1228
+ ``available_lp``, ``lone_pairs``. Edge attributes: ``order``,
1229
+ ``bond_type``, ``aromatic``, ``kekule_order``, ``kekule_bond_type``.
1230
+
1200
1231
  :param mol: RDKit molecule.
1201
1232
  :type mol: Chem.Mol
1202
- :param drop_non_aam: If ``True``, remove unmapped atoms.
1233
+ :param drop_non_aam: If ``True``, remove atoms with atom-map ``0``.
1203
1234
  :type drop_non_aam: bool
1204
- :param use_index_as_atom_map: If ``True``, use atom maps as node IDs.
1235
+ :param use_index_as_atom_map: If ``True``, use atom-map numbers as node
1236
+ IDs for mapped atoms; unmapped atoms fall back to
1237
+ ``atom.GetIdx() + 1``.
1205
1238
  :type use_index_as_atom_map: bool
1206
1239
  :returns: Lightweight molecular graph.
1207
1240
  :rtype: nx.Graph
@@ -1235,16 +1268,12 @@ class MolToGraph:
1235
1268
  aromatic=atom.GetIsAromatic(),
1236
1269
  hcount=atom.GetTotalNumHs(),
1237
1270
  charge=atom.GetFormalCharge(),
1271
+ radical=atom.GetNumRadicalElectrons(),
1238
1272
  neighbors=neighbors,
1239
1273
  atom_map=atom_map,
1240
- bond_order_sum=round(cls._safe_bond_order_sum(atom), 3),
1241
- lp_bond_order_sum=round(cls._bond_order_sum_for_lone_pairs(atom), 3),
1242
- valence_electrons=cls._safe_valence_electrons(atom),
1243
1274
  oxidation_state=round(
1244
1275
  float(oxidation_states.get(atom.GetIdx(), 0.0)), 3
1245
1276
  ),
1246
- estimated_lone_pairs=estimated_lone_pairs,
1247
- available_lone_pairs=available_lone_pairs,
1248
1277
  available_lp=available_lone_pairs > 0,
1249
1278
  lone_pairs=estimated_lone_pairs,
1250
1279
  )
@@ -1322,8 +1351,8 @@ class MolToGraph:
1322
1351
  def _create_detailed_graph(
1323
1352
  cls,
1324
1353
  mol: Chem.Mol,
1325
- drop_non_aam: bool = True,
1326
- use_index_as_atom_map: bool = True,
1354
+ drop_non_aam: bool = False,
1355
+ use_index_as_atom_map: bool = False,
1327
1356
  ) -> nx.Graph:
1328
1357
  """Create a detailed graph with fallback atom and bond attributes.
1329
1358
 
@@ -953,7 +953,7 @@ class RBLEngine:
953
953
  reason="quick_check_match",
954
954
  metadata={"solution_index": idx, "n_solutions": len(sols)},
955
955
  )
956
- return sols[idx]
956
+ return sols
957
957
 
958
958
  return None
959
959