synkit 1.6.2__tar.gz → 1.6.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {synkit-1.6.2 → synkit-1.6.3}/.gitignore +15 -3
- synkit-1.6.3/Experiment/CRN/LICENSES/BIOMODELS.txt +13 -0
- synkit-1.6.3/Experiment/CRN/LICENSES/KEGG.txt +15 -0
- synkit-1.6.3/PKG-INFO +122 -0
- synkit-1.6.3/README.md +73 -0
- {synkit-1.6.2 → synkit-1.6.3}/pyproject.toml +15 -8
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/__init__.py +2 -3
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/kegg.py +2 -3
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/scaling.py +87 -28
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/validate.py +2 -4
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/IO/sbml.py +8 -2
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/__init__.py +6 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/realizability.py +226 -23
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/deficiency.py +1 -2
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/helper.py +1 -1
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/_graph_io.py +5 -3
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/__init__.py +6 -0
- synkit-1.6.3/synkit/Chem/Mapper/README.rst +281 -0
- synkit-1.6.3/synkit/Chem/Mapper/__init__.py +232 -0
- synkit-1.6.3/synkit/Chem/Mapper/_compat.py +77 -0
- synkit-1.6.3/synkit/Chem/Mapper/adapters/__init__.py +1 -0
- synkit-1.6.3/synkit/Chem/Mapper/adapters/prediction.py +126 -0
- synkit-1.6.3/synkit/Chem/Mapper/adapters/template.py +412 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/chem/__init__.py +6 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/chem/aam.py +239 -5
- synkit-1.6.3/synkit/Chem/Mapper/chem/blind.py +160 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/chem/smiles.py +40 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/__init__.py +141 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/__init__.py +1 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/assignment_certificate.py +113 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/assignment_domains.py +162 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/assignment_verification.py +58 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/assignment/incremental_assignment.py +247 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/exact/certificate.py +2 -2
- synkit-1.6.3/synkit/Chem/Mapper/exact/core.py +183 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/__init__.py +1 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/bounds.py +319 -0
- {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search}/exhaustive.py +5 -27
- synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/inputs.py +283 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/records.py +242 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/search.py +1025 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/distance_search/verify.py +378 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/edit_support.py +375 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/hybrid.py +224 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/hydrogen.py +264 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers/__init__.py +1 -0
- {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/branching.py +27 -41
- {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/enumerate.py +5 -5
- {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/kernel.py +31 -34
- {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/milp.py +8 -1
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/__init__.py +1 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/build.py +154 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/candidates.py +349 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/canonical.py +396 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/disk_frontier.py +415 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/frontier.py +390 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/its.py +528 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/native_distance.cpp +1021 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/orbit_aggregation.py +328 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/parallel.py +205 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/runtime.py +40 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native/search.py +196 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/native_build.py +12 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/__init__.py +1 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/cost_lattice.py +43 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/factor_spectrum.py +110 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/multi_shell.py +368 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation.py +679 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation_bounds.py +436 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation_limits.py +13 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation_search.py +856 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/propagation_symmetry.py +66 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/residual_typed_bonds.py +136 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/reward_frontier.py +201 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/separator_bound.py +258 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/separator_spectrum.py +308 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/sparse_reward_bound.py +207 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/pabs/suffix_spectrum.py +299 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/search.py +55 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/seeds/__init__.py +1 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/seeds/seed.py +104 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/seeds/seed_fragments.py +148 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/seeds/seed_relaxation.py +181 -0
- synkit-1.6.3/synkit/Chem/Mapper/exact/symmetry.py +223 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/__init__.py +7 -1
- synkit-1.6.3/synkit/Chem/Mapper/graph/automorphism.py +395 -0
- synkit-1.6.3/synkit/Chem/Mapper/mapper.py +451 -0
- synkit-1.6.3/synkit/Chem/Mapper/reaction_search.py +499 -0
- synkit-1.6.3/synkit/Chem/Mapper/reporting/__init__.py +1 -0
- synkit-1.6.3/synkit/Chem/Mapper/reporting/alternatives.py +451 -0
- synkit-1.6.3/synkit/Chem/Mapper/reporting/analysis.py +681 -0
- synkit-1.6.3/synkit/Chem/Mapper/reporting/native_analysis.py +485 -0
- synkit-1.6.3/synkit/Chem/Mapper/reporting/spectrum.py +642 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/slap/__init__.py +8 -1
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/slap/lap.py +8 -5
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/slap/sequential.py +8 -3
- synkit-1.6.3/synkit/Chem/Mapper/validation/__init__.py +1 -0
- {synkit-1.6.2/synkit/Chem/Reaction/Mapper → synkit-1.6.3/synkit/Chem/Mapper/validation}/aam_validator.py +3 -5
- synkit-1.6.3/synkit/Chem/Mapper/validation/annotations.py +274 -0
- synkit-1.6.3/synkit/Chem/Mapper/validation/bonds.py +124 -0
- synkit-1.6.3/synkit/Chem/Mapper/validation/cohorts.py +72 -0
- synkit-1.6.3/synkit/Chem/Mapper/validation/identifiability.py +150 -0
- synkit-1.6.3/synkit/Chem/Mapper/validation/numerical_scope.py +36 -0
- synkit-1.6.3/synkit/Chem/Mapper/validation/orbits.py +137 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_stereo_axis_evidence.py +5 -3
- synkit-1.6.3/synkit/Chem/Reaction/Mapper/__init__.py +41 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/aam_validator.py +1 -1
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/exact.py +75 -12
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/__init__.py +49 -0
- synkit-1.6.3/synkit/Graph/MTG/gluing.py +451 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/history.py +284 -17
- synkit-1.6.3/synkit/Graph/MTG/inventory.py +118 -0
- synkit-1.6.3/synkit/Graph/MTG/local.py +447 -0
- synkit-1.6.3/synkit/Graph/MTG/observation.py +209 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/process.py +17 -2
- synkit-1.6.3/synkit/Graph/MTG/queries.py +66 -0
- synkit-1.6.3/synkit/Graph/MTG/realization.py +95 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/__init__.py +4 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/llg.py +96 -15
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/__init__.py +8 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/canonical.py +16 -3
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/changes.py +41 -3
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/configured.py +49 -84
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/enumeration.py +7 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/extended_descriptors.py +4 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/orbits.py +5 -1
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/pairwise.py +145 -19
- synkit-1.6.3/synkit/Graph/Stereo/rdkit_identity.py +118 -0
- synkit-1.6.3/synkit/Graph/Stereo/rdkit_resonance.py +140 -0
- synkit-1.6.3/synkit/Rule/Apply/conditions.py +45 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Apply/dpo.py +192 -159
- synkit-1.6.3/synkit/Rule/Apply/validation.py +354 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/composition.py +142 -14
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/laws.py +45 -3
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/search.py +27 -4
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/syn_rule.py +2 -2
- {synkit-1.6.2 → synkit-1.6.3}/synkit/version.py +1 -1
- synkit-1.6.2/PKG-INFO +0 -183
- synkit-1.6.2/README.md +0 -143
- synkit-1.6.2/synkit/Chem/Reaction/Mapper/__init__.py +0 -70
- synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact/__init__.py +0 -58
- synkit-1.6.2/synkit/Chem/Reaction/Mapper/graph/automorphism.py +0 -110
- {synkit-1.6.2 → synkit-1.6.3}/LICENSE +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/crosschecks.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/data/kegg_modules.json +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Benchmark/networks.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/abstract.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/arity.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/builder.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/derivation.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/flattener.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/keys.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/mixtures.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/smiles.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/state.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/strategy.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Construct/worker.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/IO/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/_adapter.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/pathfinder.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Pathway/reachability.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/analyzer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/minimal_semiflows.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/net.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/persistence.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/semiflows.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/siphon_search.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Petrinet/structure.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/dynamics.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/stoich.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Props/thermo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/kegg_api.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/kegg_extract.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/kegg_impute.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/kegg_parse.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Query/to_syncrn.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/_matrices.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/_parse.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/reaction.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/rule.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/species.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Structure/syncrn.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/_common.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/_ir.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/automorphism.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/canon.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/isomorphism.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/symmetry.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Symmetry/wl_canon.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/labels.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/layout.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/palette.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/validation.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/Visualize/vis.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/CRN/kinds.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Cluster/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Cluster/butina.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Fingerprint/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Fingerprint/fp_calculator.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Fingerprint/smiles_featurizer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Fingerprint/transformation_fp.py +0 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/chem/its.py +0 -0
- {synkit-1.6.2/synkit/Chem/Reaction/Mapper/exact → synkit-1.6.3/synkit/Chem/Mapper/exact/kernel_solvers}/enumeration_result.py +0 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/blockcut.py +0 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/labeled_graph.py +0 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/refine.py +0 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/graph/synkit_adapter.py +0 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/io/__init__.py +0 -0
- {synkit-1.6.2/synkit/Chem/Reaction → synkit-1.6.3/synkit/Chem}/Mapper/io/idxmapstr.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_chirality_loci.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_chirality_types.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_helical_loci.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_stereo_element_detection.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_stereo_orientation_constraints.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/_tetrahedral_carriers.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/atom_features.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/chirality.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/cip_assignment.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/cip_ranking.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/coordinate_stereo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/derived_stereo_naming.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/descriptors.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/formula.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/global_stereo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/graph_annotator.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/standardize.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/stereo_evidence.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/stereo_perception.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Molecule/valence.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/balance_check.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/canon_rsmi.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/cleaning.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/deionize.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/explicit_h_audit.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/fix_aam.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/neutralize.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/radical_wildcard.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/standardize.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/Reaction/tautomerize.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Chem/utils.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Data/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Data/aldol.json.gz +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Data/gen_partial_aam.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Data/paracetamol.json.gz +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/canon_algs.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/canon_graph.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/exact_refinement.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Canon/nauty.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Context/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Context/hier_context.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Context/radius_expand.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/api.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/audit.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/catalog.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/detector.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/model.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/recognizers.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/FG/ring_system.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/Descriptors/topology.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/graph_descriptors.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/graph_fps.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/graph_signature.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/hash_fps.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/morgan_fps.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/path_fps.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Feature/wl_hash.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/candidate.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/constructor.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/identity.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/interface.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Fusion/search.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/_misc.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hcomplete.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hcomplete_legacy.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hcompletion_algorithms.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hextend.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Hyrogen/hextend_legacy.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_builder.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_construction.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_decompose.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_destruction.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_expand.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_relabel.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/its_reverter.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/normalize_aam.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/partial_its.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/rc_extractor.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/ITS/stereo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/mcs_matcher.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/mtg.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/mtg_explore.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/series_parallel.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/MTG/utils.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/approx_mcs.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/auto_est.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/automorphism.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/batch_cluster.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/dedup_matches.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/graph_cluster.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/graph_matcher.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/graph_morphism.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/mcs_matcher.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/multi_turbo_iso.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/orbit.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/partial_matcher.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/sing.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/subgraph_matcher.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/turbo_iso.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Matcher/wl_sel.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/conversion.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/conversion_debug.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/electron_accounting.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/lwg_editor.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Mech/lwg_ops.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/constraints.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/morphism.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/stereo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/stereo_morphism.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/stereo_morphism_helpers.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Morphism/stereo_morphism_types.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/_descriptor_core.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/_descriptor_serialization.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/composition.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/couplings.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/descriptors.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/global_configured.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/global_stereo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/identity.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/interchange.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/legacy.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/matching.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/outcomes.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/rdkit_adapter.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/reaction_interchange.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/semantics.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/supports.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Stereo/wire.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/fuse_graph.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/graph_wc.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/its_merge.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/radwc.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/wc_matcher.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/Wildcard/wildcard.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/canon_graph.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/syn_graph.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Graph/utils.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/chem_converter.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/gml_to_graph.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/graph_to_gml.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/graph_to_smarts.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/smarts_expander.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/smarts_generalizer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/combinatorial/smarts_to_graph.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/conversion.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/data_io.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/data_process.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/debug.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/gml_to_nx.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/graph_to_mol.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/mol_to_graph.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/mol_to_graph_chemistry.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/nx_to_gml.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/IO/smiles_to_id.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/adapters.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/audit.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/benchmark.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/compatibility.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/drawing.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/electron_models.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/equivalence.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/evidence.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/interchange.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/model.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/neighbor_stereo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/radical_data.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/replay.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/schema.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/stereo_state.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Mechanism/symbols.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Apply/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Apply/rule_matcher.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/_identity.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Compose/synrule.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/implict_rule.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/longest_path.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/molecule_rule.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/prune_templates.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/rule_utils.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/Modify/strip_rule.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/generic_stereo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Rule/stereo_identity.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/MSR/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/MSR/path_finder.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Metrics/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Metrics/_base.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Metrics/_plot.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Metrics/_ranking.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/engine.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/matching.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/overlap.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/pipeline.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/policy.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/proof.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/reaction.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/state.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/RBL/validation.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/engine.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/product.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/rewrite.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/core/strategy.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/matching/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/matching/mixin.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/matching/policy.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/matching/symmetry.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/deduplication.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/policy.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/serialization.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/output/structural.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/stereo/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/stereo/assignment.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/stereo/mixin.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/variants/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/variants/imbalanced.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/variants/partial.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/batch.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/benchmark.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/postprocess.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/Reactor/workflow/rule_filter.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Synthesis/reactor_utils.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Utils/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Utils/utils.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/crn/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/arrows.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/chem.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/constants.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/layout.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/mapping.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/models.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/render.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/utils.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/epd/visualizer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/graph_visualizer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/its/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/its/drawer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/its_drawer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/molecule/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/molecule/drawer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/molecule/reaction.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/molecule_drawer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/mtg/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/mtg/drawer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/mtg_drawer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/pdf_writer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/reaction/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/reaction/rule.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/reaction/rxn.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/reaction_drawer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/space/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/space/chemical.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/space/embedding.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/vis_synedu/Vis/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/vis_synedu/Vis/dpo.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/vis_synedu/rxn_vis.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/vis_synedu/vis.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/visual_drawer.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/Vis/visual_model.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/__init__.py +0 -0
- {synkit-1.6.2 → synkit-1.6.3}/synkit/examples.py +0 -0
|
@@ -16,12 +16,16 @@ venv/
|
|
|
16
16
|
/dist/
|
|
17
17
|
/docs/
|
|
18
18
|
*.egg-info/
|
|
19
|
+
# Optional Mapper kernel artifacts are rebuilt from the shipped C++ source.
|
|
20
|
+
libsynkit_distance_*.so
|
|
21
|
+
libsynkit_distance_*.json
|
|
19
22
|
|
|
20
23
|
# Generated logs, reports, notebooks, and data files
|
|
21
24
|
*.log
|
|
22
25
|
*.pdf
|
|
23
26
|
*.rdf
|
|
24
27
|
*.ipynb
|
|
28
|
+
!Experiment/CRN/notebooks/crn_glycolysis_case_study.ipynb
|
|
25
29
|
*.csv
|
|
26
30
|
*.json
|
|
27
31
|
*.json.gz
|
|
@@ -29,7 +33,7 @@ venv/
|
|
|
29
33
|
*.txt
|
|
30
34
|
|
|
31
35
|
# Package resources and repository evidence retained despite the broad rules
|
|
32
|
-
!LICENSES/*.txt
|
|
36
|
+
!Experiment/CRN/LICENSES/*.txt
|
|
33
37
|
!synkit/CRN/Benchmark/data/kegg_modules.json
|
|
34
38
|
!Data/Conformance/stereomolgraph_graph_conformance.json
|
|
35
39
|
!Data/Mech/polar.json
|
|
@@ -37,7 +41,7 @@ venv/
|
|
|
37
41
|
!Data/Mech/stereo.json
|
|
38
42
|
!Data/Schema/
|
|
39
43
|
!Data/Schema/attribute_propagation_v1_5.json
|
|
40
|
-
!/
|
|
44
|
+
!/scripts/python_file_size_baseline.json
|
|
41
45
|
!Test/Synthesis/Reactor/fixtures/small_rewrite_conformance.json
|
|
42
46
|
|
|
43
47
|
# Lewis benchmark inputs and reviewed evidence
|
|
@@ -65,6 +69,10 @@ venv/
|
|
|
65
69
|
!Experiment/Stereo/Data/Perception/full_detection_report.json
|
|
66
70
|
!Experiment/Stereo/Data/Perception/perception_conformance_cases.json
|
|
67
71
|
|
|
72
|
+
# Historical reaction-stereo records consumed by experiment audits
|
|
73
|
+
!Experiment/StereoReaction/evidence/stereo_rxn_closeout.json
|
|
74
|
+
!Experiment/StereoReaction/evidence/stereo_rxn_validation.json
|
|
75
|
+
|
|
68
76
|
# Large or reproducible data products
|
|
69
77
|
/Data/Benchmark/*
|
|
70
78
|
!/Data/Benchmark/mech/
|
|
@@ -99,7 +107,8 @@ venv/
|
|
|
99
107
|
/crn/
|
|
100
108
|
/debug/
|
|
101
109
|
/dev/
|
|
102
|
-
|
|
110
|
+
# Manuscripts, evidence, figures, and local cleanup archives
|
|
111
|
+
/paper/
|
|
103
112
|
/sprint/
|
|
104
113
|
/synkit/Graph/dev/
|
|
105
114
|
|
|
@@ -114,3 +123,6 @@ test_partial.py
|
|
|
114
123
|
test_run.py
|
|
115
124
|
test_syn.py
|
|
116
125
|
test_syn_reactor.py
|
|
126
|
+
|
|
127
|
+
# Local benchmark outputs and frozen source copies stay local.
|
|
128
|
+
/benchmark_results/
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
BioModels input notice
|
|
2
|
+
======================
|
|
3
|
+
|
|
4
|
+
The optional interoperability study downloads models from BioModels. The
|
|
5
|
+
BioModels dataset, including encoded models and annotations, is made available
|
|
6
|
+
under the Creative Commons CC0 1.0 Public Domain Dedication:
|
|
7
|
+
|
|
8
|
+
https://www.ebi.ac.uk/biomodels/termsofuse
|
|
9
|
+
|
|
10
|
+
Downloaded model files are cached locally under
|
|
11
|
+
``Experiment/CRN/data/biomodels`` but are excluded from SynKit distribution
|
|
12
|
+
artifacts. Evidence reports retain identifiers, source URLs, file sizes and
|
|
13
|
+
SHA-256 checksums.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
KEGG-derived cache notice
|
|
2
|
+
=========================
|
|
3
|
+
|
|
4
|
+
The file ``synkit/CRN/Benchmark/data/kegg_modules.json`` contains records
|
|
5
|
+
derived from the Kyoto Encyclopedia of Genes and Genomes (KEGG), retrieved on
|
|
6
|
+
the date recorded inside that file. KEGG is copyright Kanehisa Laboratories.
|
|
7
|
+
|
|
8
|
+
This cache is not covered by SynKit's MIT licence. KEGG's current terms state
|
|
9
|
+
that academic users may use the KEGG website and that non-academic use requires
|
|
10
|
+
a commercial licence. See: https://www.kegg.jp/kegg/legal.html
|
|
11
|
+
|
|
12
|
+
Release maintainers must confirm that their intended redistribution of this
|
|
13
|
+
cache is authorized under the applicable KEGG terms. If it is not, the cache
|
|
14
|
+
must be excluded from the release and users must retrieve the source records
|
|
15
|
+
under their own authorized access.
|
synkit-1.6.3/PKG-INFO
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synkit
|
|
3
|
+
Version: 1.6.3
|
|
4
|
+
Summary: Utility for reaction modeling using graph grammar
|
|
5
|
+
Project-URL: homepage, https://github.com/TieuLongPhan/SynKit
|
|
6
|
+
Project-URL: source, https://github.com/TieuLongPhan/SynKit
|
|
7
|
+
Project-URL: issues, https://github.com/TieuLongPhan/SynKit/issues
|
|
8
|
+
Project-URL: documentation, https://tieulongphan.github.io/SynKit/
|
|
9
|
+
Author-email: Tieu Long Phan <tieu@bioinf.uni-leipzig.de>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Requires-Python: >=3.11
|
|
15
|
+
Requires-Dist: joblib>=1.2.0
|
|
16
|
+
Requires-Dist: matplotlib>=3.9
|
|
17
|
+
Requires-Dist: networkx>=3.3
|
|
18
|
+
Requires-Dist: numpy>=2.2.0
|
|
19
|
+
Requires-Dist: pandas>=2.2.2
|
|
20
|
+
Requires-Dist: pillow
|
|
21
|
+
Requires-Dist: rdkit>=2025.3.1
|
|
22
|
+
Requires-Dist: regex>=2024.11.6
|
|
23
|
+
Requires-Dist: requests>=2.32.3
|
|
24
|
+
Requires-Dist: scikit-learn>=1.4.2
|
|
25
|
+
Requires-Dist: scipy>=1.14.0
|
|
26
|
+
Requires-Dist: seaborn>=0.13.2
|
|
27
|
+
Requires-Dist: tqdm
|
|
28
|
+
Provides-Extra: all
|
|
29
|
+
Requires-Dist: pulp; extra == 'all'
|
|
30
|
+
Requires-Dist: sympy>=1.13.1; extra == 'all'
|
|
31
|
+
Requires-Dist: torch>=2.2.0; extra == 'all'
|
|
32
|
+
Provides-Extra: docs
|
|
33
|
+
Requires-Dist: graphviz; extra == 'docs'
|
|
34
|
+
Requires-Dist: myst-parser; extra == 'docs'
|
|
35
|
+
Requires-Dist: pydata-sphinx-theme; extra == 'docs'
|
|
36
|
+
Requires-Dist: sphinx-copybutton; extra == 'docs'
|
|
37
|
+
Requires-Dist: sphinx-design; extra == 'docs'
|
|
38
|
+
Requires-Dist: sphinx-rtd-theme; extra == 'docs'
|
|
39
|
+
Requires-Dist: sphinx-togglebutton; extra == 'docs'
|
|
40
|
+
Requires-Dist: sphinx>=6.0; extra == 'docs'
|
|
41
|
+
Requires-Dist: sphinxcontrib-bibtex; extra == 'docs'
|
|
42
|
+
Provides-Extra: milp
|
|
43
|
+
Requires-Dist: pulp; extra == 'milp'
|
|
44
|
+
Provides-Extra: test
|
|
45
|
+
Requires-Dist: flake8; extra == 'test'
|
|
46
|
+
Requires-Dist: psutil<8,>=5.9; extra == 'test'
|
|
47
|
+
Requires-Dist: pytest; extra == 'test'
|
|
48
|
+
Description-Content-Type: text/markdown
|
|
49
|
+
|
|
50
|
+
# SynKit
|
|
51
|
+
|
|
52
|
+
[](https://pypi.org/project/synkit/)
|
|
53
|
+
[](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
|
|
54
|
+
[](https://doi.org/10.5281/zenodo.15269901)
|
|
55
|
+
[](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml)
|
|
56
|
+
|
|
57
|
+
**Graph-native reaction informatics and executable electron-flow models**
|
|
58
|
+
|
|
59
|
+
SynKit is a Python toolkit for atom mapping, chemical graph transformations,
|
|
60
|
+
reaction rules, stereochemistry, and chemical reaction networks. It also
|
|
61
|
+
represents Lewis-labelled graphs and verifies user-supplied electron-flow
|
|
62
|
+
mechanisms. It does not predict the kinetically or thermodynamically preferred
|
|
63
|
+
mechanism.
|
|
64
|
+
|
|
65
|
+

|
|
66
|
+
|
|
67
|
+
## Installation
|
|
68
|
+
|
|
69
|
+
Requires Python 3.11 or later.
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
python -m pip install synkit
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
See [Getting Started](doc/getting_started.rst) for examples, optional
|
|
76
|
+
dependencies, and Docker installation.
|
|
77
|
+
|
|
78
|
+
## Documentation
|
|
79
|
+
|
|
80
|
+
- [Documentation](https://tieulongphan.github.io/SynKit/)
|
|
81
|
+
- [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
|
|
82
|
+
- [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
|
|
83
|
+
- [Changelog](doc/changelog.rst)
|
|
84
|
+
|
|
85
|
+
## Publications
|
|
86
|
+
|
|
87
|
+
- [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
|
|
88
|
+
transfers](https://arxiv.org/abs/2607.26088), submitted (2026).
|
|
89
|
+
- [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
|
|
90
|
+
Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
|
|
91
|
+
of Chemical Information and Modeling* (2025).
|
|
92
|
+
|
|
93
|
+
## Contributing
|
|
94
|
+
|
|
95
|
+
Contributions and bug reports are welcome. Create a branch from the current
|
|
96
|
+
mainline, make a focused change, and run the repository checks before opening
|
|
97
|
+
a pull request:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
git switch -c feature/short-description
|
|
101
|
+
bash scripts/lint.sh
|
|
102
|
+
bash scripts/pytest.sh
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Questions can be sent to [tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
|
|
106
|
+
|
|
107
|
+
## Contributors
|
|
108
|
+
|
|
109
|
+
- [Tieu-Long Phan](https://tieulongphan.github.io/)
|
|
110
|
+
- [Klaus Weinbauer](https://github.com/klausweinbauer)
|
|
111
|
+
- [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
|
|
112
|
+
- [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
|
|
113
|
+
|
|
114
|
+
## License
|
|
115
|
+
|
|
116
|
+
SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
|
|
117
|
+
|
|
118
|
+
## Acknowledgments
|
|
119
|
+
|
|
120
|
+
This project received funding from the European Union’s Horizon Europe
|
|
121
|
+
Doctoral Network programme under Marie Skłodowska-Curie grant agreement
|
|
122
|
+
No. 101072930 ([TACsy](https://tacsy.eu/)).
|
synkit-1.6.3/README.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# SynKit
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/synkit/)
|
|
4
|
+
[](https://github.com/tieulongphan/synkit/blob/main/LICENSE)
|
|
5
|
+
[](https://doi.org/10.5281/zenodo.15269901)
|
|
6
|
+
[](https://github.com/tieulongphan/synkit/actions/workflows/test-and-lint.yml)
|
|
7
|
+
|
|
8
|
+
**Graph-native reaction informatics and executable electron-flow models**
|
|
9
|
+
|
|
10
|
+
SynKit is a Python toolkit for atom mapping, chemical graph transformations,
|
|
11
|
+
reaction rules, stereochemistry, and chemical reaction networks. It also
|
|
12
|
+
represents Lewis-labelled graphs and verifies user-supplied electron-flow
|
|
13
|
+
mechanisms. It does not predict the kinetically or thermodynamically preferred
|
|
14
|
+
mechanism.
|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
Requires Python 3.11 or later.
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
python -m pip install synkit
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
See [Getting Started](doc/getting_started.rst) for examples, optional
|
|
27
|
+
dependencies, and Docker installation.
|
|
28
|
+
|
|
29
|
+
## Documentation
|
|
30
|
+
|
|
31
|
+
- [Documentation](https://tieulongphan.github.io/SynKit/)
|
|
32
|
+
- [API reference](https://tieulongphan.github.io/SynKit/api/index.html)
|
|
33
|
+
- [Issue tracker](https://github.com/TieuLongPhan/SynKit/issues)
|
|
34
|
+
- [Changelog](doc/changelog.rst)
|
|
35
|
+
|
|
36
|
+
## Publications
|
|
37
|
+
|
|
38
|
+
- [Lewis-labeled graphs: curly arrows and fishhooks as executable electron
|
|
39
|
+
transfers](https://arxiv.org/abs/2607.26088), submitted (2026).
|
|
40
|
+
- [SynKit: A Graph-Based Python Framework for Rule-Based Reaction Modeling and
|
|
41
|
+
Analysis](https://pubs.acs.org/doi/full/10.1021/acs.jcim.5c02123), *Journal
|
|
42
|
+
of Chemical Information and Modeling* (2025).
|
|
43
|
+
|
|
44
|
+
## Contributing
|
|
45
|
+
|
|
46
|
+
Contributions and bug reports are welcome. Create a branch from the current
|
|
47
|
+
mainline, make a focused change, and run the repository checks before opening
|
|
48
|
+
a pull request:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
git switch -c feature/short-description
|
|
52
|
+
bash scripts/lint.sh
|
|
53
|
+
bash scripts/pytest.sh
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Questions can be sent to [tieu@bioinf.uni-leipzig.de](mailto:tieu@bioinf.uni-leipzig.de).
|
|
57
|
+
|
|
58
|
+
## Contributors
|
|
59
|
+
|
|
60
|
+
- [Tieu-Long Phan](https://tieulongphan.github.io/)
|
|
61
|
+
- [Klaus Weinbauer](https://github.com/klausweinbauer)
|
|
62
|
+
- [Phuoc-Chung Nguyen Van](https://github.com/phuocchung123)
|
|
63
|
+
- [Tuyet-Minh Phan](https://github.com/tuyetminhphan)
|
|
64
|
+
|
|
65
|
+
## License
|
|
66
|
+
|
|
67
|
+
SynKit is distributed under the MIT License. See [LICENSE](LICENSE).
|
|
68
|
+
|
|
69
|
+
## Acknowledgments
|
|
70
|
+
|
|
71
|
+
This project received funding from the European Union’s Horizon Europe
|
|
72
|
+
Doctoral Network programme under Marie Skłodowska-Curie grant agreement
|
|
73
|
+
No. 101072930 ([TACsy](https://tacsy.eu/)).
|
|
@@ -1,37 +1,42 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["hatchling"]
|
|
2
|
+
requires = ["hatchling>=1.27.0"]
|
|
3
3
|
build-backend = "hatchling.build"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "synkit"
|
|
7
|
-
version = "1.6.
|
|
7
|
+
version = "1.6.3"
|
|
8
8
|
description = "Utility for reaction modeling using graph grammar"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
|
-
license =
|
|
11
|
+
license = "MIT"
|
|
12
12
|
license-files = ["LICENSE", "synkit/Graph/Stereo/LICENSES/*"]
|
|
13
13
|
authors = [
|
|
14
14
|
{ name = "Tieu Long Phan", email = "tieu@bioinf.uni-leipzig.de" }
|
|
15
15
|
]
|
|
16
16
|
classifiers = [
|
|
17
17
|
"Programming Language :: Python :: 3",
|
|
18
|
-
"License :: OSI Approved :: MIT License",
|
|
19
18
|
"Operating System :: OS Independent",
|
|
20
19
|
]
|
|
21
20
|
dependencies = [
|
|
22
21
|
"numpy>=2.2.0",
|
|
23
|
-
"scikit-learn>=1.4.
|
|
24
|
-
"pandas>=
|
|
22
|
+
"scikit-learn>=1.4.2",
|
|
23
|
+
"pandas>=2.2.2",
|
|
25
24
|
"rdkit>=2025.3.1",
|
|
26
25
|
"networkx>=3.3",
|
|
27
26
|
"scipy>=1.14.0",
|
|
28
27
|
"seaborn>=0.13.2",
|
|
29
28
|
"requests>=2.32.3",
|
|
30
29
|
"regex>=2024.11.6",
|
|
30
|
+
"joblib>=1.2.0",
|
|
31
|
+
"matplotlib>=3.9",
|
|
32
|
+
"pillow",
|
|
33
|
+
"tqdm",
|
|
31
34
|
]
|
|
32
35
|
|
|
33
36
|
[project.optional-dependencies]
|
|
34
|
-
|
|
37
|
+
test = ["flake8", "pytest", "psutil>=5.9,<8"]
|
|
38
|
+
milp = ["pulp"]
|
|
39
|
+
all = ["torch>=2.2.0", "sympy>=1.13.1", "pulp"]
|
|
35
40
|
docs = [
|
|
36
41
|
# Core Sphinx
|
|
37
42
|
"sphinx>=6.0",
|
|
@@ -66,6 +71,7 @@ packages = ["synkit"]
|
|
|
66
71
|
core-metadata-version = "2.4"
|
|
67
72
|
|
|
68
73
|
[tool.hatch.build.targets.wheel.force-include]
|
|
74
|
+
"synkit/Chem/Mapper/exact/native/native_distance.cpp" = "synkit/Chem/Mapper/exact/native/native_distance.cpp"
|
|
69
75
|
"synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
|
|
70
76
|
"synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
|
|
71
77
|
"synkit/CRN/Benchmark/data/kegg_modules.json" = "synkit/CRN/Benchmark/data/kegg_modules.json"
|
|
@@ -75,12 +81,13 @@ core-metadata-version = "2.4"
|
|
|
75
81
|
include = [
|
|
76
82
|
"/synkit",
|
|
77
83
|
"/LICENSE",
|
|
78
|
-
"/LICENSES",
|
|
84
|
+
"/Experiment/CRN/LICENSES",
|
|
79
85
|
"/README.md",
|
|
80
86
|
"/pyproject.toml",
|
|
81
87
|
]
|
|
82
88
|
|
|
83
89
|
[tool.hatch.build.targets.sdist.force-include]
|
|
90
|
+
"synkit/Chem/Mapper/exact/native/native_distance.cpp" = "synkit/Chem/Mapper/exact/native/native_distance.cpp"
|
|
84
91
|
"synkit/Data/aldol.json.gz" = "synkit/Data/aldol.json.gz"
|
|
85
92
|
"synkit/Data/paracetamol.json.gz" = "synkit/Data/paracetamol.json.gz"
|
|
86
93
|
"synkit/CRN/Benchmark/data/kegg_modules.json" = "synkit/CRN/Benchmark/data/kegg_modules.json"
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Benchmark, validation and case-study material for :mod:`synkit.CRN`.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
results in the paper can be regenerated by a reader:
|
|
3
|
+
The package includes:
|
|
5
4
|
|
|
6
5
|
- **A validation set** (:mod:`~synkit.CRN.Benchmark.networks`,
|
|
7
6
|
:mod:`~synkit.CRN.Benchmark.validate`) — literature and regression networks
|
|
@@ -11,7 +10,7 @@ results in the paper can be regenerated by a reader:
|
|
|
11
10
|
- **A scaling benchmark** (:mod:`~synkit.CRN.Benchmark.scaling`) — wall-clock
|
|
12
11
|
timings of the analysis stack against network size.
|
|
13
12
|
- **A metabolic case study** (:mod:`~synkit.CRN.Benchmark.kegg`) — cached KEGG
|
|
14
|
-
modules
|
|
13
|
+
modules processed from pathway retrieval through
|
|
15
14
|
conservation laws, persistence and flux realizability.
|
|
16
15
|
|
|
17
16
|
.. rubric:: Example
|
|
@@ -504,11 +504,10 @@ def check_glycolysis_flux(
|
|
|
504
504
|
reaction="label",
|
|
505
505
|
)
|
|
506
506
|
checker.build_petri_net_from_flow()
|
|
507
|
-
|
|
507
|
+
outcome = checker.realizability_result(max_states=max_states)
|
|
508
508
|
|
|
509
509
|
return {
|
|
510
|
-
|
|
511
|
-
"certificate": certificate,
|
|
510
|
+
**outcome.to_dict(),
|
|
512
511
|
"flux": requested,
|
|
513
512
|
"initial_marking": {"alpha-D-Glucose": initial_glucose},
|
|
514
513
|
}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
"""Scaling benchmark for the :mod:`synkit.CRN` analysis stack.
|
|
2
2
|
|
|
3
|
-
Measures wall-clock time
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
different complexity: stoichiometric rank and conservation laws are polynomial,
|
|
7
|
-
minimal semiflows and canonicalization are worst-case exponential in theory but
|
|
8
|
-
tractable on the sparse networks chemistry produces, and minimal-siphon
|
|
9
|
-
enumeration is the one that used to be the wall.
|
|
3
|
+
Measures wall-clock time against network size for parameterized synthetic
|
|
4
|
+
network families. The results locate practical runtime limits for the selected
|
|
5
|
+
families; they do not establish asymptotic complexity.
|
|
10
6
|
|
|
11
7
|
Network families
|
|
12
8
|
----------------
|
|
@@ -16,13 +12,13 @@ Network families
|
|
|
16
12
|
linear metabolic pathway.
|
|
17
13
|
``reversible_chain``
|
|
18
14
|
The same chain with every reaction reversed as well. Weakly reversible, so
|
|
19
|
-
|
|
15
|
+
exercises analyses that can terminate early on non-reversible networks.
|
|
20
16
|
``cycle``
|
|
21
17
|
A closed chain ``S0 -> ... -> Sn -> S0``, which is weakly reversible and has
|
|
22
18
|
a single conservation law.
|
|
23
19
|
``random_sparse``
|
|
24
20
|
Random bimolecular reactions at a fixed reaction-to-species ratio. The
|
|
25
|
-
|
|
21
|
+
densest of the four benchmark families.
|
|
26
22
|
|
|
27
23
|
.. rubric:: Example
|
|
28
24
|
|
|
@@ -39,6 +35,7 @@ from __future__ import annotations
|
|
|
39
35
|
import random
|
|
40
36
|
import time
|
|
41
37
|
from dataclasses import dataclass
|
|
38
|
+
from multiprocessing import get_all_start_methods, get_context
|
|
42
39
|
from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple
|
|
43
40
|
|
|
44
41
|
from ..Petrinet.structure import find_siphons
|
|
@@ -305,6 +302,10 @@ class ScalingRecord:
|
|
|
305
302
|
:param error:
|
|
306
303
|
Exception text when the task raised.
|
|
307
304
|
:type error: Optional[str]
|
|
305
|
+
|
|
306
|
+
:param timed_out:
|
|
307
|
+
Whether the task was terminated at the measurement budget.
|
|
308
|
+
:type timed_out: bool
|
|
308
309
|
"""
|
|
309
310
|
|
|
310
311
|
family: str
|
|
@@ -315,6 +316,7 @@ class ScalingRecord:
|
|
|
315
316
|
seconds: Optional[float] = None
|
|
316
317
|
result: Any = None
|
|
317
318
|
error: Optional[str] = None
|
|
319
|
+
timed_out: bool = False
|
|
318
320
|
|
|
319
321
|
def to_dict(self) -> Dict[str, Any]:
|
|
320
322
|
"""Return the record as a serializable mapping.
|
|
@@ -331,19 +333,50 @@ class ScalingRecord:
|
|
|
331
333
|
"seconds": self.seconds,
|
|
332
334
|
"result": self.result,
|
|
333
335
|
"error": self.error,
|
|
336
|
+
"timed_out": self.timed_out,
|
|
334
337
|
}
|
|
335
338
|
|
|
336
339
|
|
|
340
|
+
def _time_task_worker(
|
|
341
|
+
task: Callable[[SynCRN], Any],
|
|
342
|
+
crn: SynCRN,
|
|
343
|
+
repeats: int,
|
|
344
|
+
connection: Any,
|
|
345
|
+
) -> None:
|
|
346
|
+
"""Execute a timed task in a process that the parent can terminate.
|
|
347
|
+
|
|
348
|
+
:param task: Callable to time.
|
|
349
|
+
:type task: Callable[[SynCRN], Any]
|
|
350
|
+
:param crn: Network to pass to the task.
|
|
351
|
+
:type crn: SynCRN
|
|
352
|
+
:param repeats: Number of repeats.
|
|
353
|
+
:type repeats: int
|
|
354
|
+
:param connection: One-way multiprocessing connection.
|
|
355
|
+
:type connection: Any
|
|
356
|
+
"""
|
|
357
|
+
best: Optional[float] = None
|
|
358
|
+
result: Any = None
|
|
359
|
+
try:
|
|
360
|
+
for _ in range(max(1, repeats)):
|
|
361
|
+
started = time.perf_counter()
|
|
362
|
+
result = task(crn)
|
|
363
|
+
elapsed = time.perf_counter() - started
|
|
364
|
+
best = elapsed if best is None else min(best, elapsed)
|
|
365
|
+
connection.send((best, result, None))
|
|
366
|
+
except Exception as exc: # pragma: no cover - returned to parent
|
|
367
|
+
connection.send((None, None, f"{type(exc).__name__}: {exc}"))
|
|
368
|
+
finally:
|
|
369
|
+
connection.close()
|
|
370
|
+
|
|
371
|
+
|
|
337
372
|
def _time_task(
|
|
338
373
|
task: Callable[[SynCRN], Any],
|
|
339
374
|
crn: SynCRN,
|
|
340
375
|
*,
|
|
341
376
|
repeats: int,
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
The best rather than the mean, because the slow runs measure the machine's
|
|
346
|
-
other work rather than the algorithm.
|
|
377
|
+
time_budget: Optional[float],
|
|
378
|
+
) -> Tuple[Optional[float], Any, Optional[str], bool]:
|
|
379
|
+
"""Time one task and report the minimum of ``repeats`` runs.
|
|
347
380
|
|
|
348
381
|
:param task: Callable to time.
|
|
349
382
|
:type task: Callable[[SynCRN], Any]
|
|
@@ -351,9 +384,34 @@ def _time_task(
|
|
|
351
384
|
:type crn: SynCRN
|
|
352
385
|
:param repeats: Number of repeats.
|
|
353
386
|
:type repeats: int
|
|
354
|
-
:
|
|
355
|
-
:
|
|
387
|
+
:param time_budget: Hard wall-clock budget, or ``None`` for no limit.
|
|
388
|
+
:type time_budget: Optional[float]
|
|
389
|
+
:return: Tuple ``(seconds, result, error, timed_out)``.
|
|
390
|
+
:rtype: Tuple[Optional[float], Any, Optional[str], bool]
|
|
356
391
|
"""
|
|
392
|
+
if time_budget is not None:
|
|
393
|
+
start_method = "fork" if "fork" in get_all_start_methods() else "spawn"
|
|
394
|
+
context = get_context(start_method)
|
|
395
|
+
receiver, sender = context.Pipe(duplex=False)
|
|
396
|
+
process = context.Process(
|
|
397
|
+
target=_time_task_worker,
|
|
398
|
+
args=(task, crn, repeats, sender),
|
|
399
|
+
)
|
|
400
|
+
process.start()
|
|
401
|
+
sender.close()
|
|
402
|
+
process.join(max(0.0, time_budget))
|
|
403
|
+
if process.is_alive():
|
|
404
|
+
process.terminate()
|
|
405
|
+
process.join()
|
|
406
|
+
receiver.close()
|
|
407
|
+
return None, None, None, True
|
|
408
|
+
if receiver.poll():
|
|
409
|
+
seconds, result, error = receiver.recv()
|
|
410
|
+
receiver.close()
|
|
411
|
+
return seconds, result, error, False
|
|
412
|
+
receiver.close()
|
|
413
|
+
return None, None, f"worker exited with code {process.exitcode}", False
|
|
414
|
+
|
|
357
415
|
best: Optional[float] = None
|
|
358
416
|
result: Any = None
|
|
359
417
|
|
|
@@ -362,11 +420,11 @@ def _time_task(
|
|
|
362
420
|
try:
|
|
363
421
|
result = task(crn)
|
|
364
422
|
except Exception as exc: # pragma: no cover - reported, not raised
|
|
365
|
-
return None, None, f"{type(exc).__name__}: {exc}"
|
|
423
|
+
return None, None, f"{type(exc).__name__}: {exc}", False
|
|
366
424
|
elapsed = time.perf_counter() - started
|
|
367
425
|
best = elapsed if best is None else min(best, elapsed)
|
|
368
426
|
|
|
369
|
-
return best, result, None
|
|
427
|
+
return best, result, None, False
|
|
370
428
|
|
|
371
429
|
|
|
372
430
|
def run_scaling_benchmark(
|
|
@@ -381,8 +439,8 @@ def run_scaling_benchmark(
|
|
|
381
439
|
) -> List[ScalingRecord]:
|
|
382
440
|
"""Time each analysis across network families and sizes.
|
|
383
441
|
|
|
384
|
-
|
|
385
|
-
|
|
442
|
+
A task is terminated when it reaches ``time_budget`` and is skipped for
|
|
443
|
+
every larger size of that family, so one slow analysis cannot make the
|
|
386
444
|
whole run open-ended.
|
|
387
445
|
|
|
388
446
|
:param sizes:
|
|
@@ -445,8 +503,11 @@ def run_scaling_benchmark(
|
|
|
445
503
|
if (family, task) in exhausted:
|
|
446
504
|
continue
|
|
447
505
|
|
|
448
|
-
seconds, result, error = _time_task(
|
|
449
|
-
TASKS[task],
|
|
506
|
+
seconds, result, error, timed_out = _time_task(
|
|
507
|
+
TASKS[task],
|
|
508
|
+
crn,
|
|
509
|
+
repeats=repeats,
|
|
510
|
+
time_budget=time_budget,
|
|
450
511
|
)
|
|
451
512
|
records.append(
|
|
452
513
|
ScalingRecord(
|
|
@@ -458,15 +519,13 @@ def run_scaling_benchmark(
|
|
|
458
519
|
seconds=seconds,
|
|
459
520
|
result=result,
|
|
460
521
|
error=error,
|
|
522
|
+
timed_out=timed_out,
|
|
461
523
|
)
|
|
462
524
|
)
|
|
463
525
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
and seconds > time_budget
|
|
468
|
-
)
|
|
469
|
-
if error is not None or over_budget:
|
|
526
|
+
if error is not None:
|
|
527
|
+
exhausted.add((family, task))
|
|
528
|
+
if timed_out:
|
|
470
529
|
exhausted.add((family, task))
|
|
471
530
|
|
|
472
531
|
return records
|
|
@@ -3,10 +3,8 @@
|
|
|
3
3
|
This is the reproducible form of the paper's validation table: every benchmark
|
|
4
4
|
network is analysed, every asserted quantity is compared with the expected
|
|
5
5
|
value, and every quantity is additionally recomputed by an independent route
|
|
6
|
-
from :mod:`synkit.CRN.Benchmark.crosschecks`.
|
|
7
|
-
|
|
8
|
-
reproduces the expected verdicts, and that it agrees with a second, disjoint
|
|
9
|
-
computation of the same numbers.
|
|
6
|
+
from :mod:`synkit.CRN.Benchmark.crosschecks`. ``all_passed`` requires agreement
|
|
7
|
+
with both the expected verdicts and the independent computations.
|
|
10
8
|
|
|
11
9
|
.. rubric:: Example
|
|
12
10
|
|
|
@@ -12,7 +12,7 @@ stoichiometry). No kinetic law is written, because a ``SynCRN`` carries none;
|
|
|
12
12
|
structural analysis does not need one. Files that *do* carry kinetic laws are
|
|
13
13
|
read fine — the laws are simply ignored.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Conversion policies:
|
|
16
16
|
|
|
17
17
|
- **Reversible reactions.** SBML marks a reaction ``reversible="true"``; a
|
|
18
18
|
``SynCRN`` reaction is always directed. On import, a reversible reaction is
|
|
@@ -564,6 +564,7 @@ def _read_species(
|
|
|
564
564
|
"label": element.get("name") or sid,
|
|
565
565
|
"smiles": annotation.get("smiles"),
|
|
566
566
|
"sbml_id": sid,
|
|
567
|
+
"source_node_id": annotation.get("sourceNodeId", sid),
|
|
567
568
|
}
|
|
568
569
|
|
|
569
570
|
return species, dropped
|
|
@@ -799,7 +800,12 @@ def crn_from_sbml(
|
|
|
799
800
|
reversible = _is_true(element.get("reversible"))
|
|
800
801
|
annotation = _annotation_values(element, "reactionInfo")
|
|
801
802
|
|
|
802
|
-
extra: Dict[str, Any] = {
|
|
803
|
+
extra: Dict[str, Any] = {
|
|
804
|
+
"sbml_id": rid,
|
|
805
|
+
"source_node_id": annotation.get("sourceNodeId", rid),
|
|
806
|
+
}
|
|
807
|
+
if annotation.get("sourceKind"):
|
|
808
|
+
extra["source_kind"] = annotation["sourceKind"]
|
|
803
809
|
if annotation.get("ruleRepr"):
|
|
804
810
|
extra["rule_repr"] = annotation["ruleRepr"]
|
|
805
811
|
|
|
@@ -33,6 +33,9 @@ from .reachability import (
|
|
|
33
33
|
from .realizability import (
|
|
34
34
|
PathwayRealizability,
|
|
35
35
|
RealizabilityConfig,
|
|
36
|
+
RealizabilityResult,
|
|
37
|
+
RealizabilitySearchLimit,
|
|
38
|
+
RealizabilityStatus,
|
|
36
39
|
RealizabilitySummary,
|
|
37
40
|
run_realizability_from_syncrn,
|
|
38
41
|
syncrn_to_pr_inputs,
|
|
@@ -55,6 +58,9 @@ __all__ = [
|
|
|
55
58
|
# realizability
|
|
56
59
|
"PathwayRealizability",
|
|
57
60
|
"RealizabilityConfig",
|
|
61
|
+
"RealizabilityResult",
|
|
62
|
+
"RealizabilitySearchLimit",
|
|
63
|
+
"RealizabilityStatus",
|
|
58
64
|
"RealizabilitySummary",
|
|
59
65
|
"run_realizability_from_syncrn",
|
|
60
66
|
"syncrn_to_pr_inputs",
|