synkit 1.6.5__py3-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- synkit/CRN/Benchmark/__init__.py +53 -0
- synkit/CRN/Benchmark/crosschecks.py +13 -0
- synkit/CRN/Benchmark/kegg.py +12 -0
- synkit/CRN/Benchmark/networks.py +13 -0
- synkit/CRN/Benchmark/scaling.py +13 -0
- synkit/CRN/Benchmark/validate.py +13 -0
- synkit/CRN/Construct/__init__.py +16 -0
- synkit/CRN/Construct/abstract.py +668 -0
- synkit/CRN/Construct/arity.py +36 -0
- synkit/CRN/Construct/builder.py +619 -0
- synkit/CRN/Construct/derivation.py +63 -0
- synkit/CRN/Construct/flattener.py +100 -0
- synkit/CRN/Construct/keys.py +14 -0
- synkit/CRN/Construct/mixtures.py +117 -0
- synkit/CRN/Construct/rdkit_worker.py +69 -0
- synkit/CRN/Construct/smiles.py +99 -0
- synkit/CRN/Construct/state.py +31 -0
- synkit/CRN/Construct/strategy.py +75 -0
- synkit/CRN/Construct/worker.py +42 -0
- synkit/CRN/IO/__init__.py +36 -0
- synkit/CRN/IO/sbml.py +925 -0
- synkit/CRN/Pathway/__init__.py +72 -0
- synkit/CRN/Pathway/_adapter.py +333 -0
- synkit/CRN/Pathway/pathfinder.py +500 -0
- synkit/CRN/Pathway/reachability.py +796 -0
- synkit/CRN/Pathway/realizability.py +1322 -0
- synkit/CRN/Petrinet/__init__.py +93 -0
- synkit/CRN/Petrinet/analyzer.py +486 -0
- synkit/CRN/Petrinet/minimal_semiflows.py +436 -0
- synkit/CRN/Petrinet/net.py +1041 -0
- synkit/CRN/Petrinet/persistence.py +97 -0
- synkit/CRN/Petrinet/semiflows.py +483 -0
- synkit/CRN/Petrinet/siphon_search.py +402 -0
- synkit/CRN/Petrinet/structure.py +286 -0
- synkit/CRN/Props/__init__.py +130 -0
- synkit/CRN/Props/_rank.py +29 -0
- synkit/CRN/Props/deficiency.py +953 -0
- synkit/CRN/Props/dynamics.py +832 -0
- synkit/CRN/Props/helper.py +151 -0
- synkit/CRN/Props/stoich.py +751 -0
- synkit/CRN/Props/thermo.py +584 -0
- synkit/CRN/Query/__init__.py +66 -0
- synkit/CRN/Query/cache.py +41 -0
- synkit/CRN/Query/kegg_api.py +99 -0
- synkit/CRN/Query/kegg_extract.py +714 -0
- synkit/CRN/Query/kegg_impute.py +707 -0
- synkit/CRN/Query/kegg_parse.py +480 -0
- synkit/CRN/Query/to_syncrn.py +290 -0
- synkit/CRN/README.md +234 -0
- synkit/CRN/Structure/__init__.py +12 -0
- synkit/CRN/Structure/_graph_io.py +713 -0
- synkit/CRN/Structure/_matrices.py +88 -0
- synkit/CRN/Structure/_parse.py +544 -0
- synkit/CRN/Structure/reaction.py +237 -0
- synkit/CRN/Structure/rule.py +55 -0
- synkit/CRN/Structure/species.py +46 -0
- synkit/CRN/Structure/syncrn.py +929 -0
- synkit/CRN/Symmetry/__init__.py +20 -0
- synkit/CRN/Symmetry/_common.py +1059 -0
- synkit/CRN/Symmetry/_ir.py +940 -0
- synkit/CRN/Symmetry/automorphism.py +472 -0
- synkit/CRN/Symmetry/canon.py +441 -0
- synkit/CRN/Symmetry/isomorphism.py +412 -0
- synkit/CRN/Symmetry/symmetry.py +61 -0
- synkit/CRN/Symmetry/wl_canon.py +967 -0
- synkit/CRN/Visualize/__init__.py +11 -0
- synkit/CRN/Visualize/labels.py +113 -0
- synkit/CRN/Visualize/layout.py +708 -0
- synkit/CRN/Visualize/palette.py +292 -0
- synkit/CRN/Visualize/validation.py +122 -0
- synkit/CRN/Visualize/vis.py +1152 -0
- synkit/CRN/__init__.py +233 -0
- synkit/CRN/_build.py +50 -0
- synkit/CRN/_native_build.py +175 -0
- synkit/CRN/analysis.py +629 -0
- synkit/CRN/backend.py +74 -0
- synkit/CRN/cpp/CMakeLists.txt +58 -0
- synkit/CRN/cpp/algebra.cpp +46 -0
- synkit/CRN/cpp/closure.cpp +29 -0
- synkit/CRN/cpp/exact.h +55 -0
- synkit/CRN/cpp/pathway.cpp +46 -0
- synkit/CRN/cpp/semiflows.cpp +209 -0
- synkit/CRN/cpp/structural.cpp +240 -0
- synkit/CRN/cpp/symmetry.cpp +45 -0
- synkit/CRN/cpp/write_manifest.cmake +28 -0
- synkit/CRN/kinds.py +137 -0
- synkit/CRN/lib/synkit_crn.dll +0 -0
- synkit/CRN/lib/synkit_crn.json +33 -0
- synkit/CRN/native.py +388 -0
- synkit/CRN/native_analysis.py +459 -0
- synkit/Chem/Cluster/__init__.py +0 -0
- synkit/Chem/Cluster/butina.py +140 -0
- synkit/Chem/Fingerprint/__init__.py +0 -0
- synkit/Chem/Fingerprint/fp_calculator.py +155 -0
- synkit/Chem/Fingerprint/smiles_featurizer.py +258 -0
- synkit/Chem/Fingerprint/transformation_fp.py +139 -0
- synkit/Chem/Mapper/README.rst +43 -0
- synkit/Chem/Mapper/__init__.py +255 -0
- synkit/Chem/Mapper/_compat.py +130 -0
- synkit/Chem/Mapper/adapters/__init__.py +1 -0
- synkit/Chem/Mapper/adapters/prediction.py +126 -0
- synkit/Chem/Mapper/adapters/template.py +412 -0
- synkit/Chem/Mapper/chem/__init__.py +52 -0
- synkit/Chem/Mapper/chem/aam.py +673 -0
- synkit/Chem/Mapper/chem/blind.py +160 -0
- synkit/Chem/Mapper/chem/its.py +309 -0
- synkit/Chem/Mapper/chem/smiles.py +564 -0
- synkit/Chem/Mapper/graph/__init__.py +66 -0
- synkit/Chem/Mapper/graph/automorphism.py +395 -0
- synkit/Chem/Mapper/graph/blockcut.py +98 -0
- synkit/Chem/Mapper/graph/labeled_graph.py +104 -0
- synkit/Chem/Mapper/graph/refine.py +176 -0
- synkit/Chem/Mapper/graph/synkit_adapter.py +110 -0
- synkit/Chem/Mapper/io/__init__.py +13 -0
- synkit/Chem/Mapper/io/idxmapstr.py +82 -0
- synkit/Chem/Mapper/mapper.py +685 -0
- synkit/Chem/Mapper/reaction_search.py +554 -0
- synkit/Chem/Mapper/reporting/__init__.py +1 -0
- synkit/Chem/Mapper/reporting/alternatives.py +451 -0
- synkit/Chem/Mapper/reporting/analysis.py +681 -0
- synkit/Chem/Mapper/reporting/native_analysis.py +485 -0
- synkit/Chem/Mapper/reporting/spectrum.py +642 -0
- synkit/Chem/Mapper/solvers/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/__init__.py +141 -0
- synkit/Chem/Mapper/solvers/exact/assignment/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_certificate.py +113 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_domains.py +162 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_verification.py +58 -0
- synkit/Chem/Mapper/solvers/exact/assignment/incremental_assignment.py +247 -0
- synkit/Chem/Mapper/solvers/exact/certificate.py +128 -0
- synkit/Chem/Mapper/solvers/exact/core.py +183 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/bounds.py +319 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/exhaustive.py +179 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/inputs.py +283 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/records.py +242 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/search.py +1025 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/verify.py +378 -0
- synkit/Chem/Mapper/solvers/exact/edit_support.py +375 -0
- synkit/Chem/Mapper/solvers/exact/hybrid.py +224 -0
- synkit/Chem/Mapper/solvers/exact/hydrogen.py +264 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/branching.py +499 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/enumerate.py +1050 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/enumeration_result.py +30 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/kernel.py +256 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/milp.py +194 -0
- synkit/Chem/Mapper/solvers/exact/native/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/native/build.py +154 -0
- synkit/Chem/Mapper/solvers/exact/native/candidates.py +593 -0
- synkit/Chem/Mapper/solvers/exact/native/canonical.py +396 -0
- synkit/Chem/Mapper/solvers/exact/native/disk_frontier.py +415 -0
- synkit/Chem/Mapper/solvers/exact/native/frontier.py +390 -0
- synkit/Chem/Mapper/solvers/exact/native/hydrogen_quotient.py +213 -0
- synkit/Chem/Mapper/solvers/exact/native/its.py +528 -0
- synkit/Chem/Mapper/solvers/exact/native/native_distance.cpp +2803 -0
- synkit/Chem/Mapper/solvers/exact/native/orbit_aggregation.py +328 -0
- synkit/Chem/Mapper/solvers/exact/native/parallel.py +205 -0
- synkit/Chem/Mapper/solvers/exact/native/pmcd.py +203 -0
- synkit/Chem/Mapper/solvers/exact/native/runtime.py +40 -0
- synkit/Chem/Mapper/solvers/exact/native/search.py +294 -0
- synkit/Chem/Mapper/solvers/exact/native/separator.py +224 -0
- synkit/Chem/Mapper/solvers/exact/native_build.py +12 -0
- synkit/Chem/Mapper/solvers/exact/pabs/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/pabs/cost_lattice.py +43 -0
- synkit/Chem/Mapper/solvers/exact/pabs/factor_spectrum.py +110 -0
- synkit/Chem/Mapper/solvers/exact/pabs/multi_shell.py +368 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation.py +679 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_bounds.py +436 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_limits.py +13 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_search.py +856 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_symmetry.py +66 -0
- synkit/Chem/Mapper/solvers/exact/pabs/residual_typed_bonds.py +136 -0
- synkit/Chem/Mapper/solvers/exact/pabs/reward_frontier.py +201 -0
- synkit/Chem/Mapper/solvers/exact/pabs/separator_bound.py +258 -0
- synkit/Chem/Mapper/solvers/exact/pabs/separator_spectrum.py +308 -0
- synkit/Chem/Mapper/solvers/exact/pabs/sparse_reward_bound.py +207 -0
- synkit/Chem/Mapper/solvers/exact/pabs/suffix_spectrum.py +299 -0
- synkit/Chem/Mapper/solvers/exact/search.py +55 -0
- synkit/Chem/Mapper/solvers/exact/seeds/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed.py +104 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed_fragments.py +148 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed_relaxation.py +181 -0
- synkit/Chem/Mapper/solvers/exact/symmetry.py +223 -0
- synkit/Chem/Mapper/solvers/native/__init__.py +4 -0
- synkit/Chem/Mapper/solvers/native/assignment.py +99 -0
- synkit/Chem/Mapper/solvers/native/astar.py +22 -0
- synkit/Chem/Mapper/solvers/native/build.py +385 -0
- synkit/Chem/Mapper/solvers/native/classification.py +641 -0
- synkit/Chem/Mapper/solvers/native/core.py +378 -0
- synkit/Chem/Mapper/solvers/native/cpp/CMakeLists.txt +120 -0
- synkit/Chem/Mapper/solvers/native/cpp/examples/map_reaction.cpp +29 -0
- synkit/Chem/Mapper/solvers/native/cpp/examples/slap_graph.cpp +63 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/assignment/assignment.h +18 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/astar/astar.h +18 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/astar/bound.h +33 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/core/pmcd_witness.h +16 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/core/runtime.h +130 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/hydrogen/hydrogen.h +73 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/mapper.h +175 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/mces/mces.h +9 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/pabs/seed.h +34 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/reaction/reaction.h +30 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/sepdp/sepdp.h +21 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/slap.h +72 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/solvers/solvers.h +16 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/symmetry/classification.h +140 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/symmetry/cpabs.h +33 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/assignment/abb.cpp +302 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/CMakeLists.txt +12 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/README.md +47 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/astar.cpp +228 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/astar_graph.cpp +37 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/bound.cpp +212 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/core/dispatch.cpp +272 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/core/pmcd_witness.cpp +36 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/hydrogen/hydrogen.cpp +380 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/mces/README.md +57 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/mces/mces.cpp +287 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/bridge.cpp +334 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/chemical_floor.inc +181 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/endpoint_symmetry.inc +104 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/exact_helpers.h +20 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_assignment_certificate.h +165 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_certificate.h +125 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_model.h +365 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_provider.inc +319 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_rounding.inc +170 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_test_hooks.h +342 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/objective_reduction.inc +137 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/overlap_dual.inc +351 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/profile_seed.inc +214 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/seed_heuristics.inc +640 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/sparse_embedding.cpp +430 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/sparse_root_lp.h +176 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/test_hooks.inc +262 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/reaction/reaction.cpp +611 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/sepdp/README.md +61 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/sepdp/sepdp.cpp +253 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/slap.cpp +810 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/formulation.h +138 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/maxsat.cpp +526 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/ortools.cpp +475 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/seed.h +80 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/weighted_cnf.h +256 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/README.md +43 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/dfs.cpp +123 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/edit_support.cpp +224 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification.cpp +553 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification_pipeline.cpp +124 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification_stream.h +13 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/cpabs.cpp +455 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/edge_deck.cpp +743 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/COPYRIGHT +44 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/LICENSE-2.0.txt +202 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naugraph.c +732 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naurng.c +94 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naurng.h +49 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nausparse.c +1771 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nausparse.h +133 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nautil.c +750 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naututil.h +355 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nauty.c +1256 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nauty.h +1544 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/schreier.c +1131 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/schreier.h +70 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/sorttemplates.c +580 -0
- synkit/Chem/Mapper/solvers/native/hydrogen.py +711 -0
- synkit/Chem/Mapper/solvers/native/implicit.py +506 -0
- synkit/Chem/Mapper/solvers/native/implicit_certificate.py +187 -0
- synkit/Chem/Mapper/solvers/native/implicit_preparation.py +309 -0
- synkit/Chem/Mapper/solvers/native/lib/synkit_mapper.dll +0 -0
- synkit/Chem/Mapper/solvers/native/mces.py +16 -0
- synkit/Chem/Mapper/solvers/native/reaction.py +179 -0
- synkit/Chem/Mapper/solvers/native/reaction_build.py +277 -0
- synkit/Chem/Mapper/solvers/native/reaction_text.py +26 -0
- synkit/Chem/Mapper/solvers/native/runtime.py +242 -0
- synkit/Chem/Mapper/solvers/native/sepdp.py +47 -0
- synkit/Chem/Mapper/solvers/native/slap.py +266 -0
- synkit/Chem/Mapper/solvers/native/solvers.py +67 -0
- synkit/Chem/Mapper/solvers/native/stereo.py +86 -0
- synkit/Chem/Mapper/solvers/native/supporting.py +34 -0
- synkit/Chem/Mapper/solvers/native/symmetry.py +91 -0
- synkit/Chem/Mapper/solvers/slap/__init__.py +29 -0
- synkit/Chem/Mapper/solvers/slap/lap.py +174 -0
- synkit/Chem/Mapper/solvers/slap/sequential.py +696 -0
- synkit/Chem/Mapper/validation/__init__.py +1 -0
- synkit/Chem/Mapper/validation/aam_validator.py +442 -0
- synkit/Chem/Mapper/validation/annotations.py +274 -0
- synkit/Chem/Mapper/validation/bonds.py +124 -0
- synkit/Chem/Mapper/validation/cohorts.py +72 -0
- synkit/Chem/Mapper/validation/identifiability.py +150 -0
- synkit/Chem/Mapper/validation/numerical_scope.py +36 -0
- synkit/Chem/Mapper/validation/orbits.py +137 -0
- synkit/Chem/Molecule/__init__.py +0 -0
- synkit/Chem/Molecule/_chirality_loci.py +165 -0
- synkit/Chem/Molecule/_chirality_types.py +231 -0
- synkit/Chem/Molecule/_helical_loci.py +167 -0
- synkit/Chem/Molecule/_stereo_axis_evidence.py +202 -0
- synkit/Chem/Molecule/_stereo_element_detection.py +193 -0
- synkit/Chem/Molecule/_stereo_orientation_constraints.py +511 -0
- synkit/Chem/Molecule/_tetrahedral_carriers.py +63 -0
- synkit/Chem/Molecule/atom_features.py +379 -0
- synkit/Chem/Molecule/chirality.py +1041 -0
- synkit/Chem/Molecule/cip_assignment.py +569 -0
- synkit/Chem/Molecule/cip_ranking.py +843 -0
- synkit/Chem/Molecule/coordinate_stereo.py +503 -0
- synkit/Chem/Molecule/derived_stereo_naming.py +165 -0
- synkit/Chem/Molecule/descriptors.py +452 -0
- synkit/Chem/Molecule/formula.py +249 -0
- synkit/Chem/Molecule/global_stereo.py +175 -0
- synkit/Chem/Molecule/graph_annotator.py +300 -0
- synkit/Chem/Molecule/standardize.py +817 -0
- synkit/Chem/Molecule/stereo_evidence.py +179 -0
- synkit/Chem/Molecule/stereo_perception.py +1032 -0
- synkit/Chem/Molecule/valence.py +123 -0
- synkit/Chem/Reaction/Mapper/__init__.py +44 -0
- synkit/Chem/Reaction/__init__.py +20 -0
- synkit/Chem/Reaction/aam_validator.py +5 -0
- synkit/Chem/Reaction/balance_check.py +138 -0
- synkit/Chem/Reaction/canon_rsmi.py +249 -0
- synkit/Chem/Reaction/cleaning.py +58 -0
- synkit/Chem/Reaction/deionize.py +199 -0
- synkit/Chem/Reaction/explicit_h_audit.py +232 -0
- synkit/Chem/Reaction/fix_aam.py +64 -0
- synkit/Chem/Reaction/neutralize.py +207 -0
- synkit/Chem/Reaction/radical_wildcard.py +224 -0
- synkit/Chem/Reaction/standardize.py +203 -0
- synkit/Chem/Reaction/tautomerize.py +205 -0
- synkit/Chem/__init__.py +1 -0
- synkit/Chem/utils.py +315 -0
- synkit/Data/__init__.py +0 -0
- synkit/Data/aldol.json.gz +1 -0
- synkit/Data/gen_partial_aam.py +147 -0
- synkit/Data/paracetamol.json.gz +1 -0
- synkit/Graph/Canon/__init__.py +16 -0
- synkit/Graph/Canon/_native/__init__.py +13 -0
- synkit/Graph/Canon/_native/build.py +93 -0
- synkit/Graph/Canon/_native/lib/synkit_canon.dll +0 -0
- synkit/Graph/Canon/_native/prepare.py +49 -0
- synkit/Graph/Canon/_native/runtime.py +140 -0
- synkit/Graph/Canon/_native/search.py +137 -0
- synkit/Graph/Canon/canon_algs.py +228 -0
- synkit/Graph/Canon/canon_graph.py +531 -0
- synkit/Graph/Canon/cpp/CMakeLists.txt +42 -0
- synkit/Graph/Canon/cpp/README.md +123 -0
- synkit/Graph/Canon/cpp/examples/canonical_graph.cpp +16 -0
- synkit/Graph/Canon/cpp/include/synkit_canon/canon.h +85 -0
- synkit/Graph/Canon/cpp/src/canonical.cpp +391 -0
- synkit/Graph/Canon/cpp/src/symmetry.h +83 -0
- synkit/Graph/Canon/cpp/tests/symmetry.cpp +93 -0
- synkit/Graph/Canon/exact.py +1020 -0
- synkit/Graph/Canon/exact_refinement.py +368 -0
- synkit/Graph/Canon/nauty.py +143 -0
- synkit/Graph/Context/__init__.py +0 -0
- synkit/Graph/Context/hier_context.py +244 -0
- synkit/Graph/Context/radius_expand.py +252 -0
- synkit/Graph/FG/__init__.py +19 -0
- synkit/Graph/FG/api.py +39 -0
- synkit/Graph/FG/audit.py +155 -0
- synkit/Graph/FG/catalog.py +919 -0
- synkit/Graph/FG/detector.py +288 -0
- synkit/Graph/FG/model.py +97 -0
- synkit/Graph/FG/recognizers.py +274 -0
- synkit/Graph/FG/ring_system.py +154 -0
- synkit/Graph/Feature/Descriptors/topology.py +857 -0
- synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
- synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +222 -0
- synkit/Graph/Feature/__init__.py +5 -0
- synkit/Graph/Feature/graph_descriptors.py +323 -0
- synkit/Graph/Feature/graph_fps.py +96 -0
- synkit/Graph/Feature/graph_signature.py +239 -0
- synkit/Graph/Feature/hash_fps.py +133 -0
- synkit/Graph/Feature/morgan_fps.py +88 -0
- synkit/Graph/Feature/path_fps.py +81 -0
- synkit/Graph/Feature/wl_hash.py +134 -0
- synkit/Graph/Fusion/__init__.py +85 -0
- synkit/Graph/Fusion/candidate.py +559 -0
- synkit/Graph/Fusion/constructor.py +877 -0
- synkit/Graph/Fusion/identity.py +184 -0
- synkit/Graph/Fusion/interface.py +700 -0
- synkit/Graph/Fusion/search.py +241 -0
- synkit/Graph/Hyrogen/__init__.py +6 -0
- synkit/Graph/Hyrogen/_misc.py +591 -0
- synkit/Graph/Hyrogen/hcomplete.py +995 -0
- synkit/Graph/Hyrogen/hcomplete_legacy.py +368 -0
- synkit/Graph/Hyrogen/hcompletion_algorithms.py +713 -0
- synkit/Graph/Hyrogen/hextend.py +570 -0
- synkit/Graph/Hyrogen/hextend_legacy.py +215 -0
- synkit/Graph/ITS/__init__.py +4 -0
- synkit/Graph/ITS/its_builder.py +120 -0
- synkit/Graph/ITS/its_construction.py +719 -0
- synkit/Graph/ITS/its_decompose.py +572 -0
- synkit/Graph/ITS/its_destruction.py +331 -0
- synkit/Graph/ITS/its_expand.py +1251 -0
- synkit/Graph/ITS/its_relabel.py +187 -0
- synkit/Graph/ITS/its_reverter.py +356 -0
- synkit/Graph/ITS/normalize_aam.py +145 -0
- synkit/Graph/ITS/partial_its.py +238 -0
- synkit/Graph/ITS/rc_extractor.py +656 -0
- synkit/Graph/ITS/stereo.py +74 -0
- synkit/Graph/MTG/__init__.py +107 -0
- synkit/Graph/MTG/gluing.py +451 -0
- synkit/Graph/MTG/history.py +928 -0
- synkit/Graph/MTG/inventory.py +118 -0
- synkit/Graph/MTG/local.py +447 -0
- synkit/Graph/MTG/mcs_matcher.py +246 -0
- synkit/Graph/MTG/mtg.py +611 -0
- synkit/Graph/MTG/mtg_explore.py +74 -0
- synkit/Graph/MTG/observation.py +209 -0
- synkit/Graph/MTG/process.py +577 -0
- synkit/Graph/MTG/queries.py +66 -0
- synkit/Graph/MTG/realization.py +95 -0
- synkit/Graph/MTG/series_parallel.py +107 -0
- synkit/Graph/MTG/utils.py +424 -0
- synkit/Graph/Matcher/__init__.py +10 -0
- synkit/Graph/Matcher/approx_mcs.py +1264 -0
- synkit/Graph/Matcher/auto_est.py +736 -0
- synkit/Graph/Matcher/automorphism.py +314 -0
- synkit/Graph/Matcher/batch_cluster.py +224 -0
- synkit/Graph/Matcher/dedup_matches.py +247 -0
- synkit/Graph/Matcher/graph_cluster.py +191 -0
- synkit/Graph/Matcher/graph_matcher.py +312 -0
- synkit/Graph/Matcher/graph_morphism.py +421 -0
- synkit/Graph/Matcher/mcs_matcher.py +804 -0
- synkit/Graph/Matcher/multi_turbo_iso.py +186 -0
- synkit/Graph/Matcher/orbit.py +284 -0
- synkit/Graph/Matcher/partial_matcher.py +694 -0
- synkit/Graph/Matcher/sing.py +544 -0
- synkit/Graph/Matcher/subgraph_matcher.py +812 -0
- synkit/Graph/Matcher/turbo_iso.py +272 -0
- synkit/Graph/Matcher/wl_sel.py +537 -0
- synkit/Graph/Mech/__init__.py +26 -0
- synkit/Graph/Mech/conversion.py +1466 -0
- synkit/Graph/Mech/conversion_debug.py +237 -0
- synkit/Graph/Mech/electron_accounting.py +200 -0
- synkit/Graph/Mech/lwg_editor.py +406 -0
- synkit/Graph/Mech/lwg_ops.py +313 -0
- synkit/Graph/Morphism/__init__.py +99 -0
- synkit/Graph/Morphism/constraints.py +460 -0
- synkit/Graph/Morphism/llg.py +999 -0
- synkit/Graph/Morphism/morphism.py +349 -0
- synkit/Graph/Morphism/stereo.py +258 -0
- synkit/Graph/Morphism/stereo_morphism.py +383 -0
- synkit/Graph/Morphism/stereo_morphism_helpers.py +957 -0
- synkit/Graph/Morphism/stereo_morphism_types.py +117 -0
- synkit/Graph/Stereo/__init__.py +376 -0
- synkit/Graph/Stereo/_descriptor_core.py +207 -0
- synkit/Graph/Stereo/_descriptor_serialization.py +138 -0
- synkit/Graph/Stereo/canonical.py +648 -0
- synkit/Graph/Stereo/changes.py +964 -0
- synkit/Graph/Stereo/composition.py +391 -0
- synkit/Graph/Stereo/configured.py +946 -0
- synkit/Graph/Stereo/couplings.py +245 -0
- synkit/Graph/Stereo/descriptors.py +1030 -0
- synkit/Graph/Stereo/enumeration.py +597 -0
- synkit/Graph/Stereo/extended_descriptors.py +406 -0
- synkit/Graph/Stereo/global_configured.py +152 -0
- synkit/Graph/Stereo/global_stereo.py +304 -0
- synkit/Graph/Stereo/identity.py +648 -0
- synkit/Graph/Stereo/interchange.py +496 -0
- synkit/Graph/Stereo/legacy.py +460 -0
- synkit/Graph/Stereo/matching.py +899 -0
- synkit/Graph/Stereo/native.py +154 -0
- synkit/Graph/Stereo/orbits.py +668 -0
- synkit/Graph/Stereo/outcomes.py +99 -0
- synkit/Graph/Stereo/pairwise.py +350 -0
- synkit/Graph/Stereo/rdkit_adapter.py +662 -0
- synkit/Graph/Stereo/rdkit_identity.py +118 -0
- synkit/Graph/Stereo/rdkit_resonance.py +140 -0
- synkit/Graph/Stereo/reaction_interchange.py +266 -0
- synkit/Graph/Stereo/semantics.py +296 -0
- synkit/Graph/Stereo/supports.py +257 -0
- synkit/Graph/Stereo/wire.py +339 -0
- synkit/Graph/Wildcard/__init__.py +0 -0
- synkit/Graph/Wildcard/fuse_graph.py +156 -0
- synkit/Graph/Wildcard/graph_wc.py +303 -0
- synkit/Graph/Wildcard/its_merge.py +857 -0
- synkit/Graph/Wildcard/radwc.py +114 -0
- synkit/Graph/Wildcard/wc_matcher.py +576 -0
- synkit/Graph/Wildcard/wildcard.py +225 -0
- synkit/Graph/__init__.py +17 -0
- synkit/Graph/canon_graph.py +14 -0
- synkit/Graph/syn_graph.py +199 -0
- synkit/Graph/utils.py +324 -0
- synkit/IO/__init__.py +4 -0
- synkit/IO/chem_converter.py +1059 -0
- synkit/IO/combinatorial/__init__.py +8 -0
- synkit/IO/combinatorial/gml_to_graph.py +223 -0
- synkit/IO/combinatorial/graph_to_gml.py +280 -0
- synkit/IO/combinatorial/graph_to_smarts.py +186 -0
- synkit/IO/combinatorial/smarts_expander.py +147 -0
- synkit/IO/combinatorial/smarts_generalizer.py +133 -0
- synkit/IO/combinatorial/smarts_to_graph.py +179 -0
- synkit/IO/conversion.py +42 -0
- synkit/IO/data_io.py +269 -0
- synkit/IO/data_process.py +143 -0
- synkit/IO/debug.py +73 -0
- synkit/IO/gml_to_nx.py +150 -0
- synkit/IO/graph_to_mol.py +199 -0
- synkit/IO/mol_to_graph.py +1105 -0
- synkit/IO/mol_to_graph_chemistry.py +545 -0
- synkit/IO/nx_to_gml.py +209 -0
- synkit/IO/smiles_to_id.py +123 -0
- synkit/Mechanism/__init__.py +151 -0
- synkit/Mechanism/adapters.py +136 -0
- synkit/Mechanism/audit.py +323 -0
- synkit/Mechanism/benchmark.py +638 -0
- synkit/Mechanism/compatibility.py +13 -0
- synkit/Mechanism/drawing.py +85 -0
- synkit/Mechanism/electron_models.py +725 -0
- synkit/Mechanism/equivalence.py +521 -0
- synkit/Mechanism/evidence.py +262 -0
- synkit/Mechanism/interchange.py +141 -0
- synkit/Mechanism/model.py +918 -0
- synkit/Mechanism/neighbor_stereo.py +312 -0
- synkit/Mechanism/radical_data.py +740 -0
- synkit/Mechanism/replay.py +986 -0
- synkit/Mechanism/schema.py +264 -0
- synkit/Mechanism/stereo_state.py +416 -0
- synkit/Mechanism/symbols.py +91 -0
- synkit/Rule/Apply/__init__.py +35 -0
- synkit/Rule/Apply/conditions.py +45 -0
- synkit/Rule/Apply/dpo.py +998 -0
- synkit/Rule/Apply/rule_matcher.py +218 -0
- synkit/Rule/Apply/validation.py +354 -0
- synkit/Rule/Compose/__init__.py +106 -0
- synkit/Rule/Compose/_identity.py +43 -0
- synkit/Rule/Compose/composition.py +976 -0
- synkit/Rule/Compose/laws.py +439 -0
- synkit/Rule/Compose/search.py +771 -0
- synkit/Rule/Compose/synrule.py +170 -0
- synkit/Rule/Modify/__init__.py +0 -0
- synkit/Rule/Modify/implict_rule.py +56 -0
- synkit/Rule/Modify/longest_path.py +92 -0
- synkit/Rule/Modify/molecule_rule.py +115 -0
- synkit/Rule/Modify/prune_templates.py +78 -0
- synkit/Rule/Modify/rule_utils.py +194 -0
- synkit/Rule/Modify/strip_rule.py +97 -0
- synkit/Rule/__init__.py +28 -0
- synkit/Rule/generic_stereo.py +884 -0
- synkit/Rule/stereo_identity.py +271 -0
- synkit/Rule/syn_rule.py +1090 -0
- synkit/Synthesis/MSR/__init__.py +0 -0
- synkit/Synthesis/MSR/path_finder.py +239 -0
- synkit/Synthesis/Metrics/__init__.py +0 -0
- synkit/Synthesis/Metrics/_base.py +52 -0
- synkit/Synthesis/Metrics/_plot.py +129 -0
- synkit/Synthesis/Metrics/_ranking.py +179 -0
- synkit/Synthesis/RBL/__init__.py +80 -0
- synkit/Synthesis/RBL/engine.py +1249 -0
- synkit/Synthesis/RBL/matching.py +652 -0
- synkit/Synthesis/RBL/overlap.py +336 -0
- synkit/Synthesis/RBL/pipeline.py +376 -0
- synkit/Synthesis/RBL/policy.py +139 -0
- synkit/Synthesis/RBL/proof.py +370 -0
- synkit/Synthesis/RBL/reaction.py +506 -0
- synkit/Synthesis/RBL/state.py +169 -0
- synkit/Synthesis/RBL/validation.py +1060 -0
- synkit/Synthesis/Reactor/__init__.py +60 -0
- synkit/Synthesis/Reactor/core/__init__.py +1 -0
- synkit/Synthesis/Reactor/core/engine.py +967 -0
- synkit/Synthesis/Reactor/core/product.py +621 -0
- synkit/Synthesis/Reactor/core/rewrite.py +561 -0
- synkit/Synthesis/Reactor/core/strategy.py +44 -0
- synkit/Synthesis/Reactor/matching/__init__.py +1 -0
- synkit/Synthesis/Reactor/matching/mixin.py +920 -0
- synkit/Synthesis/Reactor/matching/policy.py +345 -0
- synkit/Synthesis/Reactor/matching/symmetry.py +309 -0
- synkit/Synthesis/Reactor/output/__init__.py +1 -0
- synkit/Synthesis/Reactor/output/deduplication.py +703 -0
- synkit/Synthesis/Reactor/output/policy.py +16 -0
- synkit/Synthesis/Reactor/output/serialization.py +485 -0
- synkit/Synthesis/Reactor/output/structural.py +893 -0
- synkit/Synthesis/Reactor/stereo/__init__.py +1 -0
- synkit/Synthesis/Reactor/stereo/assignment.py +35 -0
- synkit/Synthesis/Reactor/stereo/mixin.py +780 -0
- synkit/Synthesis/Reactor/variants/__init__.py +1 -0
- synkit/Synthesis/Reactor/variants/imbalanced.py +180 -0
- synkit/Synthesis/Reactor/variants/partial.py +84 -0
- synkit/Synthesis/Reactor/workflow/__init__.py +1 -0
- synkit/Synthesis/Reactor/workflow/batch.py +550 -0
- synkit/Synthesis/Reactor/workflow/benchmark.py +143 -0
- synkit/Synthesis/Reactor/workflow/postprocess.py +267 -0
- synkit/Synthesis/Reactor/workflow/rule_filter.py +210 -0
- synkit/Synthesis/__init__.py +0 -0
- synkit/Synthesis/reactor_utils.py +316 -0
- synkit/Utils/__init__.py +0 -0
- synkit/Utils/utils.py +172 -0
- synkit/Vis/__init__.py +91 -0
- synkit/Vis/crn/__init__.py +40 -0
- synkit/Vis/epd/__init__.py +20 -0
- synkit/Vis/epd/arrows.py +425 -0
- synkit/Vis/epd/chem.py +197 -0
- synkit/Vis/epd/constants.py +83 -0
- synkit/Vis/epd/layout.py +283 -0
- synkit/Vis/epd/mapping.py +51 -0
- synkit/Vis/epd/models.py +136 -0
- synkit/Vis/epd/render.py +543 -0
- synkit/Vis/epd/utils.py +108 -0
- synkit/Vis/epd/visualizer.py +811 -0
- synkit/Vis/graph_visualizer.py +375 -0
- synkit/Vis/its/__init__.py +19 -0
- synkit/Vis/its/drawer.py +615 -0
- synkit/Vis/its_drawer.py +35 -0
- synkit/Vis/molecule/__init__.py +31 -0
- synkit/Vis/molecule/drawer.py +563 -0
- synkit/Vis/molecule/reaction.py +285 -0
- synkit/Vis/molecule_drawer.py +33 -0
- synkit/Vis/mtg/__init__.py +17 -0
- synkit/Vis/mtg/drawer.py +769 -0
- synkit/Vis/mtg_drawer.py +34 -0
- synkit/Vis/pdf_writer.py +146 -0
- synkit/Vis/reaction/__init__.py +19 -0
- synkit/Vis/reaction/rule.py +141 -0
- synkit/Vis/reaction/rxn.py +532 -0
- synkit/Vis/reaction_drawer.py +41 -0
- synkit/Vis/space/__init__.py +17 -0
- synkit/Vis/space/chemical.py +80 -0
- synkit/Vis/space/embedding.py +87 -0
- synkit/Vis/vis_synedu/Vis/__init__.py +7 -0
- synkit/Vis/vis_synedu/Vis/dpo.py +862 -0
- synkit/Vis/vis_synedu/rxn_vis.py +377 -0
- synkit/Vis/vis_synedu/vis.py +501 -0
- synkit/Vis/visual_drawer.py +215 -0
- synkit/Vis/visual_model.py +520 -0
- synkit/__init__.py +3 -0
- synkit/_native.py +91 -0
- synkit/examples.py +50 -0
- synkit/version.py +23 -0
- synkit-1.6.5.dist-info/METADATA +156 -0
- synkit-1.6.5.dist-info/RECORD +636 -0
- synkit-1.6.5.dist-info/WHEEL +4 -0
- synkit-1.6.5.dist-info/licenses/LICENSE +21 -0
- synkit-1.6.5.dist-info/licenses/synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/COPYRIGHT +44 -0
- synkit-1.6.5.dist-info/licenses/synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/LICENSE-2.0.txt +202 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
from collections import Counter
|
|
3
|
+
from synkit.Chem.Reaction.standardize import Standardize
|
|
4
|
+
from synkit.Graph.Matcher.graph_cluster import GraphCluster
|
|
5
|
+
from synkit.IO.chem_converter import rsmi_to_its, gml_to_smart
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _get_unique_aam(list_aam: list) -> list:
|
|
9
|
+
"""Retrieves the unique atom-atom mappings (AAM) by clustering a list of
|
|
10
|
+
ITS graphs.
|
|
11
|
+
|
|
12
|
+
This function first converts each item in the provided list of AAM strings to an ITS graph
|
|
13
|
+
using the `rsmi_to_its` function. Then, it performs iterative clustering of the ITS graphs
|
|
14
|
+
based on matching nodes and edges, returning a list of unique AAMs based on the clustering results.
|
|
15
|
+
|
|
16
|
+
:param list_aam: A list of AAM strings that will be converted to ITS graphs and clustered.
|
|
17
|
+
:type list_aam: list
|
|
18
|
+
|
|
19
|
+
:return: A list of unique AAMs based on the iterative clustering process.
|
|
20
|
+
:rtype: list
|
|
21
|
+
|
|
22
|
+
:raises Exception: If an error occurs during the conversion or clustering process, an exception is raised.
|
|
23
|
+
"""
|
|
24
|
+
its_list = [rsmi_to_its(i) for i in list_aam]
|
|
25
|
+
|
|
26
|
+
cluster = GraphCluster()
|
|
27
|
+
|
|
28
|
+
cls, _ = cluster.iterative_cluster(
|
|
29
|
+
its_list,
|
|
30
|
+
attributes=None,
|
|
31
|
+
nodeMatch=cluster.nodeMatch,
|
|
32
|
+
edgeMatch=cluster.edgeMatch,
|
|
33
|
+
)
|
|
34
|
+
unique = []
|
|
35
|
+
for subset in cls:
|
|
36
|
+
unique.append(list_aam[list(subset)[0]])
|
|
37
|
+
return unique
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _get_connected_subgraphs(gml: str, invert: bool = False):
|
|
41
|
+
"""Given a GML string, this function returns the number of connected
|
|
42
|
+
subgraphs based on the 'smart' representation split or a list of subgraphs,
|
|
43
|
+
depending on the invert flag.
|
|
44
|
+
|
|
45
|
+
:param gml: GML string to convert to SMARTS.
|
|
46
|
+
:type gml: str
|
|
47
|
+
:param invert: Count product components instead of reactant components.
|
|
48
|
+
:type invert: bool
|
|
49
|
+
:return: Number of connected components on the selected reaction side.
|
|
50
|
+
:rtype: int
|
|
51
|
+
:raises ValueError: If ``gml`` is empty or lacks the ``>>`` delimiter.
|
|
52
|
+
"""
|
|
53
|
+
# Validate GML input (ensure it's a valid non-empty string)
|
|
54
|
+
if not isinstance(gml, str) or not gml.strip():
|
|
55
|
+
raise ValueError("Invalid GML string provided.")
|
|
56
|
+
|
|
57
|
+
# Convert GML to 'smart' representation
|
|
58
|
+
smart = gml_to_smart(gml, sanitize=False)
|
|
59
|
+
|
|
60
|
+
# Split the 'smart' string by the delimiter '>>' to get the left (r) and right (p) parts
|
|
61
|
+
try:
|
|
62
|
+
left_part, right_part = smart.split(">>")
|
|
63
|
+
except ValueError:
|
|
64
|
+
raise ValueError("GML string does not contain the expected '>>' delimiter.")
|
|
65
|
+
|
|
66
|
+
# Handle the result based on the invert flag
|
|
67
|
+
if invert:
|
|
68
|
+
# Return the count of subgraphs in the right part (p)
|
|
69
|
+
return len(right_part.split("."))
|
|
70
|
+
else:
|
|
71
|
+
# Return a list of subgraphs from the left part (r)
|
|
72
|
+
return len(left_part.split("."))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _get_reagent(original_smiles: list, output_rsmi: str, invert: bool = False):
|
|
76
|
+
"""Identifies reagents present in the original SMILES list that are absent
|
|
77
|
+
in the processed output SMILES string.
|
|
78
|
+
|
|
79
|
+
:param original_smiles: list of SMILES strings representing the original reagents.
|
|
80
|
+
:param output_rsmi: SMILES string of the reaction, which is standardized and split to obtain new SMILES strings.
|
|
81
|
+
:param invert: bool, flag to choose between reactants or products for comparison.
|
|
82
|
+
|
|
83
|
+
:return: List of SMILES strings found in original but not in the new list.
|
|
84
|
+
"""
|
|
85
|
+
output_rsmi = Standardize().fit(output_rsmi)
|
|
86
|
+
reactants, products = output_rsmi.split(">>")
|
|
87
|
+
smiles = products.split(".") if invert else reactants.split(".")
|
|
88
|
+
|
|
89
|
+
# Use Counter to find differences
|
|
90
|
+
original_count = Counter(original_smiles)
|
|
91
|
+
new_count = Counter(smiles)
|
|
92
|
+
reagent_difference = (
|
|
93
|
+
original_count - new_count
|
|
94
|
+
) # Subtract counts to find unique in original
|
|
95
|
+
|
|
96
|
+
# Extract unique reagents
|
|
97
|
+
unique_reagents = list(reagent_difference.elements())
|
|
98
|
+
|
|
99
|
+
return unique_reagents
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _get_reagent_rsmi(rsmi: str) -> List[str]:
|
|
103
|
+
"""Identifies reagents that appear in both the reactant and product sides
|
|
104
|
+
of a reaction SMILES string, suggesting these elements are unchanged by the
|
|
105
|
+
chemical reaction.
|
|
106
|
+
|
|
107
|
+
:param rsmi: A reaction SMILES string formatted as "reactants>>products".
|
|
108
|
+
:type rsmi: str
|
|
109
|
+
|
|
110
|
+
:return: A list of unique reagents that appear on both sides of the reaction, unchanged.
|
|
111
|
+
:rtype: List[str]
|
|
112
|
+
"""
|
|
113
|
+
# Standardize the input reaction SMILES
|
|
114
|
+
rsmi = Standardize().fit(rsmi)
|
|
115
|
+
|
|
116
|
+
# Splitting the standardized rSMI into reactants and products
|
|
117
|
+
reactants, products = rsmi.split(">>")
|
|
118
|
+
reactants = reactants.split(".")
|
|
119
|
+
products = products.split(".")
|
|
120
|
+
|
|
121
|
+
# Count occurrences of each molecule in reactants and products
|
|
122
|
+
reactants_count = Counter(reactants)
|
|
123
|
+
products_count = Counter(products)
|
|
124
|
+
|
|
125
|
+
# Find common elements in reactants and products
|
|
126
|
+
common_elements = reactants_count & products_count # Use intersection
|
|
127
|
+
|
|
128
|
+
# Extract and return the unique reagents that are common
|
|
129
|
+
unique_reagents = list(common_elements.elements())
|
|
130
|
+
|
|
131
|
+
return unique_reagents
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _remove_reagent(rsmi: str) -> str:
|
|
135
|
+
"""Removes common molecules from the reactants and products in a SMILES
|
|
136
|
+
reaction string.
|
|
137
|
+
|
|
138
|
+
This function identifies the molecules that appear on both sides of the reaction
|
|
139
|
+
(reactants and products) and removes one occurrence of each common molecule from
|
|
140
|
+
both sides.
|
|
141
|
+
|
|
142
|
+
:param rsmi: A SMILES string representing a chemical reaction in the form:
|
|
143
|
+
'reactant1.reactant2...>>product1.product2...'
|
|
144
|
+
:type rsmi: str
|
|
145
|
+
|
|
146
|
+
:return: Reaction SMILES with common molecules removed from both sides.
|
|
147
|
+
|
|
148
|
+
Example: >>> remove_reagent_from_smiles('CC=O.CC=O.CCC=O>>CC=CO.CC=O.CC=O') 'CCC=O>>CC=CO'
|
|
149
|
+
:rtype: str
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
# Split the input SMILES string into reactants and products
|
|
153
|
+
reactants, products = rsmi.split(">>")
|
|
154
|
+
|
|
155
|
+
# Split the reactants and products by '.' to separate molecules
|
|
156
|
+
reactant_molecules = reactants.split(".")
|
|
157
|
+
product_molecules = products.split(".")
|
|
158
|
+
|
|
159
|
+
# Count the occurrences of each molecule in reactants and products
|
|
160
|
+
reactant_count = Counter(reactant_molecules)
|
|
161
|
+
product_count = Counter(product_molecules)
|
|
162
|
+
|
|
163
|
+
# Find common molecules between reactants and products
|
|
164
|
+
common_molecules = set(reactant_count) & set(product_count)
|
|
165
|
+
|
|
166
|
+
# Remove common molecules by the minimum occurrences in both reactants and products
|
|
167
|
+
for molecule in common_molecules:
|
|
168
|
+
common_occurrences = min(reactant_count[molecule], product_count[molecule])
|
|
169
|
+
|
|
170
|
+
# Decrease the count by the common occurrences
|
|
171
|
+
reactant_count[molecule] -= common_occurrences
|
|
172
|
+
product_count[molecule] -= common_occurrences
|
|
173
|
+
|
|
174
|
+
# Rebuild the lists of reactant and product molecules after removal
|
|
175
|
+
filtered_reactant_molecules = [
|
|
176
|
+
molecule for molecule, count in reactant_count.items() for _ in range(count)
|
|
177
|
+
]
|
|
178
|
+
filtered_product_molecules = [
|
|
179
|
+
molecule for molecule, count in product_count.items() for _ in range(count)
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
# Join the remaining molecules back into SMILES strings
|
|
183
|
+
new_reactants = ".".join(filtered_reactant_molecules)
|
|
184
|
+
new_products = ".".join(filtered_product_molecules)
|
|
185
|
+
|
|
186
|
+
# Return the updated reaction string
|
|
187
|
+
return f"{new_reactants}>>{new_products}"
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _add_reagent(rsmi: str, reagents: list):
|
|
191
|
+
"""Modifies the SMILES representation of a reaction by adding additional
|
|
192
|
+
reagents.
|
|
193
|
+
|
|
194
|
+
:param rsmi: str, the SMILES reaction string, expected to contain '>>' separating reactants and products.
|
|
195
|
+
:param reagents: list, a list of reagent SMILES strings to be added.
|
|
196
|
+
|
|
197
|
+
:return: a new SMILES string with reagents added to both reactants and products.
|
|
198
|
+
:rtype: str
|
|
199
|
+
"""
|
|
200
|
+
if not reagents:
|
|
201
|
+
return rsmi # Return original if no reagents are added
|
|
202
|
+
|
|
203
|
+
try:
|
|
204
|
+
reactants, products = rsmi.split(">>")
|
|
205
|
+
except ValueError:
|
|
206
|
+
raise ValueError("Input SMILES string does not contain '>>'")
|
|
207
|
+
|
|
208
|
+
# Prepare the reagents string only once
|
|
209
|
+
reagents_string = ".".join(reagents)
|
|
210
|
+
|
|
211
|
+
# Incorporate reagents into both reactants and products
|
|
212
|
+
modified_reactants = (
|
|
213
|
+
f"{reactants}.{reagents_string}" if reactants else reagents_string
|
|
214
|
+
)
|
|
215
|
+
modified_products = f"{products}.{reagents_string}" if products else reagents_string
|
|
216
|
+
|
|
217
|
+
return f"{modified_reactants}>>{modified_products}"
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def _calculate_max_depth(reaction_tree, current_node=None, depth=0):
|
|
221
|
+
"""Calculate the maximum depth of a reaction tree.
|
|
222
|
+
|
|
223
|
+
:param reaction_tree: A dictionary where keys are reaction SMILES (RSMI)
|
|
224
|
+
and values are lists of product reactions.
|
|
225
|
+
:type reaction_tree: dict
|
|
226
|
+
:param current_node: The current node in the tree being explored (reaction SMILES).
|
|
227
|
+
:type current_node: str
|
|
228
|
+
:param depth: The current depth of the tree.
|
|
229
|
+
:type depth: int
|
|
230
|
+
|
|
231
|
+
:return: The maximum depth of the tree.
|
|
232
|
+
:rtype: int
|
|
233
|
+
"""
|
|
234
|
+
# If current_node is None, start from the root node (first key in the reaction tree)
|
|
235
|
+
if current_node is None:
|
|
236
|
+
current_node = list(reaction_tree.keys())[0]
|
|
237
|
+
|
|
238
|
+
# Get the products of the current node (reaction)
|
|
239
|
+
products = reaction_tree.get(current_node, [])
|
|
240
|
+
|
|
241
|
+
# If no products, we are at a leaf node, return the current depth
|
|
242
|
+
if not products:
|
|
243
|
+
return depth
|
|
244
|
+
|
|
245
|
+
# Recursively calculate the depth for each product and return the maximum
|
|
246
|
+
max_subtree_depth = max(
|
|
247
|
+
_calculate_max_depth(reaction_tree, product, depth + 1) for product in products
|
|
248
|
+
)
|
|
249
|
+
return max_subtree_depth
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def _find_all_paths(
|
|
253
|
+
reaction_tree,
|
|
254
|
+
target_products,
|
|
255
|
+
current_node,
|
|
256
|
+
target_depth,
|
|
257
|
+
current_depth=0,
|
|
258
|
+
path=None,
|
|
259
|
+
):
|
|
260
|
+
"""Recursively find all paths from the root to the maximum depth in the
|
|
261
|
+
reaction tree.
|
|
262
|
+
|
|
263
|
+
:param reaction_tree: A dictionary of reaction SMILES with products.
|
|
264
|
+
:type reaction_tree: dict
|
|
265
|
+
:param current_node: The current node (reaction SMILES).
|
|
266
|
+
:type current_node: str
|
|
267
|
+
:param target_depth: The depth at which the product matches the root's product.
|
|
268
|
+
:type target_depth: int
|
|
269
|
+
:param current_depth: The current depth of the search.
|
|
270
|
+
:type current_depth: int
|
|
271
|
+
:param path: The current path in the tree.
|
|
272
|
+
:type path: list
|
|
273
|
+
|
|
274
|
+
:return: List of all paths to the max depth.
|
|
275
|
+
"""
|
|
276
|
+
if path is None:
|
|
277
|
+
path = []
|
|
278
|
+
|
|
279
|
+
# Add the current node (reaction SMILES) to the path
|
|
280
|
+
path.append(current_node)
|
|
281
|
+
|
|
282
|
+
# If we have reached the target depth, check the product
|
|
283
|
+
if current_depth == target_depth:
|
|
284
|
+
# Extract products of the current node
|
|
285
|
+
current_products = sorted(
|
|
286
|
+
current_node.split(">>")[1].split("."), key=len
|
|
287
|
+
) # Sort by length of SMILES
|
|
288
|
+
largest_current_product = current_products[-1] if current_products else None
|
|
289
|
+
|
|
290
|
+
# Process target_products to get the largest product
|
|
291
|
+
|
|
292
|
+
sorted_target_products = sorted(
|
|
293
|
+
target_products, key=len
|
|
294
|
+
) # target_products should be a string here
|
|
295
|
+
|
|
296
|
+
largest_target_product = (
|
|
297
|
+
sorted_target_products[-1] if sorted_target_products else None
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
# Compare the largest elements
|
|
301
|
+
return [path] if largest_current_product == largest_target_product else []
|
|
302
|
+
|
|
303
|
+
# If we haven't reached the target depth, recurse on the products
|
|
304
|
+
paths = []
|
|
305
|
+
for product in reaction_tree.get(current_node, []):
|
|
306
|
+
paths.extend(
|
|
307
|
+
_find_all_paths(
|
|
308
|
+
reaction_tree,
|
|
309
|
+
target_products,
|
|
310
|
+
product,
|
|
311
|
+
target_depth,
|
|
312
|
+
current_depth + 1,
|
|
313
|
+
path.copy(),
|
|
314
|
+
)
|
|
315
|
+
)
|
|
316
|
+
return paths
|
synkit/Utils/__init__.py
ADDED
|
File without changes
|
synkit/Utils/utils.py
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import random
|
|
2
|
+
from typing import Dict, List, Optional
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
import networkx as nx
|
|
5
|
+
from typing import Iterable
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def stratified_random_sample(
|
|
9
|
+
data: List[Dict[str, any]],
|
|
10
|
+
property_key: str,
|
|
11
|
+
samples_per_class: int = 1,
|
|
12
|
+
seed: Optional[int] = 42,
|
|
13
|
+
bypass: bool = False,
|
|
14
|
+
) -> List[Dict[str, any]]:
|
|
15
|
+
"""Stratifies and samples data from a list of dictionaries based on a
|
|
16
|
+
specified property key.
|
|
17
|
+
|
|
18
|
+
:param data: The data to sample from, a list of dictionaries.
|
|
19
|
+
:type data: List[Dict[str, any]]
|
|
20
|
+
:param property_key: The key in the dictionaries to stratify by.
|
|
21
|
+
:type property_key: str
|
|
22
|
+
:param samples_per_class: The number of samples to take from each class.
|
|
23
|
+
Defaults to 1.
|
|
24
|
+
:type samples_per_class: int
|
|
25
|
+
:param seed: The seed for the random number generator
|
|
26
|
+
for reproducibility. Defaults to 42.
|
|
27
|
+
:type seed: Optional[int], optional
|
|
28
|
+
:param bypass: If True, classes with fewer than
|
|
29
|
+
`samples_per_class` entries will be skipped without raising an error.
|
|
30
|
+
Defaults to False.
|
|
31
|
+
:type bypass: bool, optional
|
|
32
|
+
|
|
33
|
+
:return: A list of sampled dictionaries, where each entry corresponds to a sampled item.
|
|
34
|
+
:rtype: List[Dict[str, any]]
|
|
35
|
+
|
|
36
|
+
:raises ValueError: If a class has fewer than `samples_per_class` entries and `bypass` is False.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
if seed is not None:
|
|
40
|
+
random.seed(seed)
|
|
41
|
+
|
|
42
|
+
stratified_data = {}
|
|
43
|
+
for item in data:
|
|
44
|
+
key = item.get(property_key)
|
|
45
|
+
if key is None:
|
|
46
|
+
continue # Exclude data items where the specified key is not present
|
|
47
|
+
if key in stratified_data:
|
|
48
|
+
stratified_data[key].append(item)
|
|
49
|
+
else:
|
|
50
|
+
stratified_data[key] = [item]
|
|
51
|
+
|
|
52
|
+
sampled_data = []
|
|
53
|
+
for key, items in stratified_data.items():
|
|
54
|
+
class_size = len(items)
|
|
55
|
+
if class_size >= samples_per_class:
|
|
56
|
+
sampled_data.extend(random.sample(items, samples_per_class))
|
|
57
|
+
elif bypass:
|
|
58
|
+
continue # Skip this group entirely if not enough data and bypass is True
|
|
59
|
+
else:
|
|
60
|
+
raise ValueError(
|
|
61
|
+
f"Not enough data to sample {samples_per_class} items for class '{key}', "
|
|
62
|
+
f"only {class_size} available."
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
return sampled_data
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def calculate_processing_time(start_time_str: str, end_time_str: str) -> float:
|
|
69
|
+
"""Calculates the processing time in seconds between two timestamps.
|
|
70
|
+
|
|
71
|
+
:param start_time_str: A string representing the start time in the format
|
|
72
|
+
'YYYY-MM-DD HH:MM:SS,fff'.
|
|
73
|
+
:type start_time_str: str
|
|
74
|
+
:param end_time_str: A string representing the end time in the same format as
|
|
75
|
+
start_time_str.
|
|
76
|
+
:type end_time_str: str
|
|
77
|
+
|
|
78
|
+
:return: The duration between the start and end time in seconds.
|
|
79
|
+
:rtype: float
|
|
80
|
+
|
|
81
|
+
:raises ValueError: If the input strings do not match the expected format.
|
|
82
|
+
"""
|
|
83
|
+
datetime_format = "%Y-%m-%d %H:%M:%S,%f"
|
|
84
|
+
|
|
85
|
+
start_time = datetime.strptime(start_time_str, datetime_format)
|
|
86
|
+
end_time = datetime.strptime(end_time_str, datetime_format)
|
|
87
|
+
|
|
88
|
+
duration = end_time - start_time
|
|
89
|
+
|
|
90
|
+
return duration.total_seconds()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def remove_explicit_hydrogen(
|
|
94
|
+
Graph: nx.Graph, excluded_indices: Iterable[int]
|
|
95
|
+
) -> nx.Graph:
|
|
96
|
+
"""Processes a molecular graph by calculating hydrogen count ('h_count')
|
|
97
|
+
for each node and removing hydrogen nodes that are not specified in the
|
|
98
|
+
excluded indices.
|
|
99
|
+
|
|
100
|
+
:param Graph: The input graph with nodes expected to have an 'element' attribute.
|
|
101
|
+
:type Graph: nx.Graph
|
|
102
|
+
:param excluded_indices: Indices of hydrogen nodes to be preserved and excluded from 'h_count' calculations.
|
|
103
|
+
:type excluded_indices: Iterable[int]
|
|
104
|
+
|
|
105
|
+
:return: The modified graph where each node has an 'h_count' attribute indicating the count
|
|
106
|
+
of hydrogen neighbors, and specific hydrogens have been removed unless listed in
|
|
107
|
+
excluded_indices.
|
|
108
|
+
:rtype: nx.Graph
|
|
109
|
+
|
|
110
|
+
.. rubric:: Notes
|
|
111
|
+
|
|
112
|
+
This function operates on a copy of the input graph and does not alter the original.
|
|
113
|
+
"""
|
|
114
|
+
G = Graph.copy()
|
|
115
|
+
|
|
116
|
+
# Calculate h_count for each node
|
|
117
|
+
for node in list(G.nodes):
|
|
118
|
+
h_count = 0
|
|
119
|
+
for neighbor in G.neighbors(node):
|
|
120
|
+
if (
|
|
121
|
+
G.nodes[neighbor].get("element") == "H"
|
|
122
|
+
and neighbor not in excluded_indices
|
|
123
|
+
):
|
|
124
|
+
h_count += 1
|
|
125
|
+
G.nodes[node]["hcount"] = h_count
|
|
126
|
+
|
|
127
|
+
# Remove hydrogen nodes not in excluded indices
|
|
128
|
+
nodes_to_remove = [
|
|
129
|
+
n
|
|
130
|
+
for n in G.nodes
|
|
131
|
+
if G.nodes[n].get("element") == "H" and n not in excluded_indices
|
|
132
|
+
]
|
|
133
|
+
G.remove_nodes_from(nodes_to_remove)
|
|
134
|
+
|
|
135
|
+
return G
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def fix_implicit_hydrogen(Graph: nx.Graph, indices: Iterable[int]) -> nx.Graph:
|
|
139
|
+
"""Adjusts the 'h_count' attribute of specific nodes in a molecular graph,
|
|
140
|
+
decreasing it based on the presence of neighboring hydrogen atoms that are
|
|
141
|
+
also included in the specified indices. This function works on a copy of
|
|
142
|
+
the provided graph and returns the modified copy.
|
|
143
|
+
|
|
144
|
+
:param Graph: Graph whose nodes contain ``element`` and optionally
|
|
145
|
+
``hcount`` attributes.
|
|
146
|
+
:type Graph: nx.Graph
|
|
147
|
+
:param indices: Nodes whose neighboring explicit hydrogens should reduce
|
|
148
|
+
their implicit hydrogen count.
|
|
149
|
+
:type indices: Iterable[int]
|
|
150
|
+
:return: Graph copy with adjusted ``hcount`` values.
|
|
151
|
+
:rtype: nx.Graph
|
|
152
|
+
|
|
153
|
+
.. rubric:: Notes
|
|
154
|
+
|
|
155
|
+
Ensure the 'hcount' exists and is appropriately structured before using this
|
|
156
|
+
function. It is assumed that 'hcount' is a mutable integer that can be directly
|
|
157
|
+
decremented.
|
|
158
|
+
"""
|
|
159
|
+
G = Graph.copy() # Work on a copy of the graph to preserve the original
|
|
160
|
+
valid_indices = set(indices).intersection(
|
|
161
|
+
G.nodes
|
|
162
|
+
) # Ensure node indices exist in the graph
|
|
163
|
+
|
|
164
|
+
for node in valid_indices:
|
|
165
|
+
if "hcount" in G.nodes[node]: # Ensure the node has an 'h_count' to modify
|
|
166
|
+
for neighbor in G.neighbors(node):
|
|
167
|
+
# Check if neighbor is hydrogen and also in indices
|
|
168
|
+
if G.nodes[neighbor].get("element") == "H" and neighbor in indices:
|
|
169
|
+
if G.nodes[node].get("element") != "H":
|
|
170
|
+
G.nodes[node]["hcount"] -= 1
|
|
171
|
+
|
|
172
|
+
return G
|
synkit/Vis/__init__.py
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""Visualization APIs.
|
|
2
|
+
|
|
3
|
+
The preferred domain namespaces are:
|
|
4
|
+
|
|
5
|
+
* :mod:`synkit.Vis.molecule` for molecule and reaction graph panels.
|
|
6
|
+
* :mod:`synkit.Vis.its` for ITS visualizations.
|
|
7
|
+
* :mod:`synkit.Vis.mtg` for MTG timeline and step visualizations.
|
|
8
|
+
* :mod:`synkit.Vis.epd` for electron-pushing diagrams.
|
|
9
|
+
* :mod:`synkit.Vis.reaction` for RDKit reaction and rule images.
|
|
10
|
+
* :mod:`synkit.Vis.space` for chemical-space plots and embeddings.
|
|
11
|
+
* :mod:`synkit.Vis.crn` for chemical reaction network visualizations.
|
|
12
|
+
|
|
13
|
+
Flat imports from :mod:`synkit.Vis` remain supported for the public drawing
|
|
14
|
+
functions exported below.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from .graph_visualizer import GraphVisualizer
|
|
18
|
+
from .reaction import RXNVis, RuleVis
|
|
19
|
+
from .space import Embedding, adjust_legend_handles, scatter_plot
|
|
20
|
+
from .crn import CRNStyle, CRNVis, draw_crn
|
|
21
|
+
from .visual_model import (
|
|
22
|
+
VisualEdge,
|
|
23
|
+
VisualGraph,
|
|
24
|
+
VisualKind,
|
|
25
|
+
VisualNode,
|
|
26
|
+
detect_visual_kind,
|
|
27
|
+
iter_changed_edges,
|
|
28
|
+
iter_changed_nodes,
|
|
29
|
+
summarize_visual_graph,
|
|
30
|
+
to_visual_graph,
|
|
31
|
+
)
|
|
32
|
+
from .visual_drawer import draw_graph
|
|
33
|
+
from .molecule import draw_molecule_graph
|
|
34
|
+
from .molecule import (
|
|
35
|
+
ReactionHighlights,
|
|
36
|
+
draw_reaction_graph,
|
|
37
|
+
draw_reaction_graphs,
|
|
38
|
+
find_reaction_highlights,
|
|
39
|
+
)
|
|
40
|
+
from .its import draw_its_from_rsmi, draw_its_graph, draw_its_only
|
|
41
|
+
from .mtg import draw_mtg_graph, draw_mtg_steps
|
|
42
|
+
from .epd import (
|
|
43
|
+
MechanismVisualizer,
|
|
44
|
+
Transition,
|
|
45
|
+
transition_from_epd_step,
|
|
46
|
+
transitions_from_epd,
|
|
47
|
+
)
|
|
48
|
+
from . import crn, epd, its, molecule, mtg, reaction, space
|
|
49
|
+
|
|
50
|
+
__all__ = [
|
|
51
|
+
"GraphVisualizer",
|
|
52
|
+
"RuleVis",
|
|
53
|
+
"RXNVis",
|
|
54
|
+
"Embedding",
|
|
55
|
+
"CRNStyle",
|
|
56
|
+
"CRNVis",
|
|
57
|
+
"draw_crn",
|
|
58
|
+
"VisualEdge",
|
|
59
|
+
"VisualGraph",
|
|
60
|
+
"VisualKind",
|
|
61
|
+
"VisualNode",
|
|
62
|
+
"detect_visual_kind",
|
|
63
|
+
"iter_changed_edges",
|
|
64
|
+
"iter_changed_nodes",
|
|
65
|
+
"summarize_visual_graph",
|
|
66
|
+
"to_visual_graph",
|
|
67
|
+
"draw_graph",
|
|
68
|
+
"draw_molecule_graph",
|
|
69
|
+
"ReactionHighlights",
|
|
70
|
+
"draw_reaction_graph",
|
|
71
|
+
"draw_reaction_graphs",
|
|
72
|
+
"find_reaction_highlights",
|
|
73
|
+
"draw_its_from_rsmi",
|
|
74
|
+
"draw_its_graph",
|
|
75
|
+
"draw_its_only",
|
|
76
|
+
"draw_mtg_graph",
|
|
77
|
+
"draw_mtg_steps",
|
|
78
|
+
"MechanismVisualizer",
|
|
79
|
+
"Transition",
|
|
80
|
+
"transition_from_epd_step",
|
|
81
|
+
"transitions_from_epd",
|
|
82
|
+
"scatter_plot",
|
|
83
|
+
"adjust_legend_handles",
|
|
84
|
+
"molecule",
|
|
85
|
+
"its",
|
|
86
|
+
"mtg",
|
|
87
|
+
"epd",
|
|
88
|
+
"reaction",
|
|
89
|
+
"space",
|
|
90
|
+
"crn",
|
|
91
|
+
]
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Chemical reaction network visualization namespace.
|
|
2
|
+
|
|
3
|
+
This namespace re-exports :mod:`synkit.CRN.Visualize`, which is the single CRN
|
|
4
|
+
visualizer in SynKit. It draws the species--reaction bipartite graph of a
|
|
5
|
+
:class:`~synkit.CRN.Structure.syncrn.SynCRN` (or any equivalent NetworkX
|
|
6
|
+
digraph) with layered layout, palettes and highlighting.
|
|
7
|
+
|
|
8
|
+
.. rubric:: Example
|
|
9
|
+
|
|
10
|
+
.. code-block:: python
|
|
11
|
+
|
|
12
|
+
from synkit.CRN import SynCRN
|
|
13
|
+
from synkit.Vis.crn import draw_crn
|
|
14
|
+
|
|
15
|
+
draw_crn(SynCRN.from_reaction_strings(["A>>B", "B>>C"]).to_digraph())
|
|
16
|
+
|
|
17
|
+
.. rubric:: Removed
|
|
18
|
+
|
|
19
|
+
``CRNVisualizer`` has been removed. It plotted the ``dev_crn`` hypergraph
|
|
20
|
+
object, which no longer exists in the package, so every call raised
|
|
21
|
+
``AttributeError``. Use :class:`~synkit.CRN.Visualize.vis.CRNVis` instead.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from synkit.CRN.Visualize import (
|
|
25
|
+
ColorPalette,
|
|
26
|
+
CRNStyle,
|
|
27
|
+
CRNVis,
|
|
28
|
+
draw_crn,
|
|
29
|
+
get_palette,
|
|
30
|
+
palette_names,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
__all__ = [
|
|
34
|
+
"CRNStyle",
|
|
35
|
+
"CRNVis",
|
|
36
|
+
"ColorPalette",
|
|
37
|
+
"draw_crn",
|
|
38
|
+
"get_palette",
|
|
39
|
+
"palette_names",
|
|
40
|
+
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""Visualization submodule for mechanism trajectories.
|
|
4
|
+
|
|
5
|
+
Main entry points
|
|
6
|
+
-----------------
|
|
7
|
+
- :class:`MechanismVisualizer`
|
|
8
|
+
- :class:`Transition`
|
|
9
|
+
- :func:`transitions_from_epd`
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from .models import Transition, transition_from_epd_step, transitions_from_epd
|
|
13
|
+
from .visualizer import MechanismVisualizer
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"MechanismVisualizer",
|
|
17
|
+
"Transition",
|
|
18
|
+
"transition_from_epd_step",
|
|
19
|
+
"transitions_from_epd",
|
|
20
|
+
]
|