synkit 2.0.0b1__tar.gz → 2.0.0b2__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-2.0.0b1 → synkit-2.0.0b2}/PKG-INFO +2 -2
- {synkit-2.0.0b1 → synkit-2.0.0b2}/README.md +1 -1
- {synkit-2.0.0b1 → synkit-2.0.0b2}/pyproject.toml +1 -1
- synkit-2.0.0b2/synkit/Graph/Fusion/__init__.py +71 -0
- synkit-2.0.0b2/synkit/Graph/Fusion/candidate.py +175 -0
- synkit-2.0.0b2/synkit/Graph/Fusion/constructor.py +461 -0
- synkit-2.0.0b2/synkit/Graph/Fusion/identity.py +183 -0
- synkit-2.0.0b2/synkit/Graph/Fusion/interface.py +598 -0
- synkit-2.0.0b2/synkit/Graph/Fusion/search.py +237 -0
- synkit-2.0.0b2/synkit/Graph/Morphism/__init__.py +55 -0
- synkit-2.0.0b2/synkit/Graph/Morphism/constraints.py +451 -0
- synkit-2.0.0b2/synkit/Graph/Morphism/morphism.py +349 -0
- synkit-2.0.0b2/synkit/Graph/Morphism/stereo.py +254 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/fusion_validation.py +53 -21
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/rbl_engine.py +180 -6
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/rbl_policy.py +4 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/version.py +1 -1
- {synkit-2.0.0b1 → synkit-2.0.0b2}/.gitignore +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/Data/Mech/README.md +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/Data/Mech/polar.json +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/Data/Mech/radical.json +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/Data/Mech/stereo.json +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/LICENSE +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/LICENSES/StereoMolGraph-MIT.txt +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/DAG/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/DAG/syncrn.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/abstract.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/arity.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/builder.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/derivation.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/flattener.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/keys.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/mixtures.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/smiles.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/state.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/strategy.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Construct/worker.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/_adapter.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/pathfinder.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/reachability.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Pathway/realizability.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/analyzer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/net.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/persistence.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/semiflows.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Petrinet/structure.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/dynamics.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/helper.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/stoich.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Props/thermo.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/kegg_api.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/kegg_extract.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/kegg_impute.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Query/kegg_parse.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/reaction.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/rule.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/species.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Structure/syncrn.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/_common.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/_ir.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/automorphism.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/canon.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/isomorphism.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/symmetry.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Symmetry/wl_canon.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/crn_vis.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/labels.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/layout.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/palette.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/validation.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/Visualize/vis.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/backend.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/conversion.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/hyperedge.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/hypergraph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Structure/rxn.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Symmetry/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Symmetry/automorphism.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Symmetry/canon.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/Symmetry/wl_canon.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/configs/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/configs/loader.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/configs/models.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/constants.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/crn_formula.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/deficiency.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/enumerator.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/exceptions.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/explorer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/helpers.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/injectivity.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/motif.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/network.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/pathway.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/properties.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/reaction.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/utils.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/CRN/dev_crn/viz.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Cluster/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Cluster/butina.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Fingerprint/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Fingerprint/fp_calculator.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Fingerprint/smiles_featurizer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Fingerprint/transformation_fp.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/atom_features.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/descriptors.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/formula.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/graph_annotator.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/standardize.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Molecule/valence.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/aam_validator.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/chem/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/chem/aam.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/chem/its.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/chem/smiles.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/branching.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/certificate.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/enumerate.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/exhaustive.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/kernel.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/exact/milp.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/automorphism.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/blockcut.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/labeled_graph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/refine.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/graph/synkit_adapter.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/io/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/io/idxmapstr.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/slap/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/slap/lap.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/Mapper/slap/sequential.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/aam_validator.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/balance_check.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/canon_rsmi.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/cleaning.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/deionize.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/explicit_h_audit.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/fix_aam.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/neutralize.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/radical_wildcard.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/standardize.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/Reaction/tautomerize.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Chem/utils.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Data/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Data/aldol.json.gz +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Data/gen_partial_aam.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Data/paracetamol.json.gz +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Canon/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Canon/canon_algs.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Canon/canon_graph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Canon/nauty.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Context/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Context/hier_context.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Context/radius_expand.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/api.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/audit.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/catalog.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/detector.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/model.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/FG/ring_system.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/Descriptors/topology.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/graph_descriptors.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/graph_fps.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/graph_signature.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/hash_fps.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/morgan_fps.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/path_fps.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Feature/wl_hash.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Hyrogen/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Hyrogen/_misc.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Hyrogen/hcomplete.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Hyrogen/hextend.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_builder.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_construction.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_decompose.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_destruction.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_expand.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_relabel.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/its_reverter.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/normalize_aam.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/partial_its.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/ITS/rc_extractor.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/mcs_matcher.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/mtg.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/mtg_explore.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/MTG/utils.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/approx_mcs.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/auto_est.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/automorphism.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/batch_cluster.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/dedup_matches.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/graph_cluster.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/graph_matcher.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/graph_morphism.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/mcs_matcher.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/multi_turbo_iso.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/orbit.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/partial_matcher.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/sing.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/subgraph_matcher.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/turbo_iso.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Matcher/wl_sel.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/conversion.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/electron_accounting.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/lwg_editor.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Mech/lwg_ops.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/changes.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/couplings.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/descriptors.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/identity.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/interchange.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/matching.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/outcomes.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Stereo/rdkit_adapter.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/fuse_graph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/graph_wc.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/its_merge.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/radwc.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/wc_matcher.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/Wildcard/wildcard.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/canon_graph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/syn_graph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Graph/utils.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/chem_converter.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/gml_to_graph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/graph_to_gml.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/graph_to_smarts.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/smarts_expander.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/smarts_generalizer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/combinatorial/smarts_to_graph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/conversion.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/data_io.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/data_process.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/debug.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/gml_to_nx.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/graph_to_mol.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/mol_to_graph.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/nx_to_gml.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/IO/smiles_to_id.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/adapters.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/audit.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/benchmark.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/compatibility.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/drawing.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/equivalence.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/evidence.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/interchange.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/model.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/radical_data.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/replay.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/schema.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/stereo_state.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Mechanism/symbols.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Apply/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Apply/rule_matcher.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Compose/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Compose/_identity.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/implict_rule.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/longest_path.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/molecule_rule.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/prune_templates.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/rule_utils.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/Modify/strip_rule.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/stereo_identity.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Rule/syn_rule.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/MSR/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/MSR/path_finder.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Metrics/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Metrics/_base.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Metrics/_plot.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Metrics/_ranking.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/batch_reactor.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/benchmark.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/imba_engine.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/partial_engine.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/post_syn.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/rule_filter.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/strategy.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/Reactor/syn_reactor.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Synthesis/reactor_utils.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Utils/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Utils/utils.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/crn/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/crn/visualizer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/arrows.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/chem.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/constants.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/layout.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/mapping.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/models.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/render.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/utils.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/epd/visualizer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/graph_visualizer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/its/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/its/drawer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/its_drawer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/molecule/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/molecule/drawer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/molecule/reaction.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/molecule_drawer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/mtg/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/mtg/drawer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/mtg_drawer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/pdf_writer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/reaction/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/reaction/rule.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/reaction/rxn.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/reaction_drawer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/space/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/space/chemical.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/space/embedding.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/vis_synedu/Vis/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/vis_synedu/Vis/dpo.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/vis_synedu/rxn_vis.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/vis_synedu/vis.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/visual_drawer.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/Vis/visual_model.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/__init__.py +0 -0
- {synkit-2.0.0b1 → synkit-2.0.0b2}/synkit/examples.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synkit
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b2
|
|
4
4
|
Summary: Utility for reaction modeling using graph grammar
|
|
5
5
|
Project-URL: homepage, https://github.com/TieuLongPhan/SynKit
|
|
6
6
|
Project-URL: source, https://github.com/TieuLongPhan/SynKit
|
|
@@ -87,7 +87,7 @@ non-tetrahedral or atrop orientation fails explicitly instead of disappearing.
|
|
|
87
87
|
Coordinate inference, rigid-bond descriptor variants, enhanced stereo groups,
|
|
88
88
|
face-selectivity prediction, and physical inference of configurational
|
|
89
89
|
stability remain outside the current claims. The prerelease package version is
|
|
90
|
-
`2.0.
|
|
90
|
+
`2.0.0b2`; its mechanism schema remains `2.0.0-draft1` while that schema is
|
|
91
91
|
still under prerelease review.
|
|
92
92
|
|
|
93
93
|
Stereo-bearing reaction rules keep three concerns separate:
|
|
@@ -47,7 +47,7 @@ non-tetrahedral or atrop orientation fails explicitly instead of disappearing.
|
|
|
47
47
|
Coordinate inference, rigid-bond descriptor variants, enhanced stereo groups,
|
|
48
48
|
face-selectivity prediction, and physical inference of configurational
|
|
49
49
|
stability remain outside the current claims. The prerelease package version is
|
|
50
|
-
`2.0.
|
|
50
|
+
`2.0.0b2`; its mechanism schema remains `2.0.0-draft1` while that schema is
|
|
51
51
|
still under prerelease review.
|
|
52
52
|
|
|
53
53
|
Stereo-bearing reaction rules keep three concerns separate:
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Verified pushout-style graph fusion and proof-bearing deterministic search."""
|
|
2
|
+
|
|
3
|
+
from .candidate import (
|
|
4
|
+
FUSION_PROOF_SCHEMA,
|
|
5
|
+
FusionCandidate,
|
|
6
|
+
FusionScore,
|
|
7
|
+
default_fusion_score,
|
|
8
|
+
fusion_candidate_from_construction,
|
|
9
|
+
fusion_candidates_exactly_equivalent,
|
|
10
|
+
)
|
|
11
|
+
from .constructor import (
|
|
12
|
+
EndpointCertificate,
|
|
13
|
+
FusionConstruction,
|
|
14
|
+
FusionConstructionError,
|
|
15
|
+
FusionConstructionIssue,
|
|
16
|
+
FusionConstructionIssueCode,
|
|
17
|
+
FusionProvenance,
|
|
18
|
+
construct_pushout,
|
|
19
|
+
)
|
|
20
|
+
from .identity import (
|
|
21
|
+
FUSION_EDGE_IDENTITY_KEYS,
|
|
22
|
+
FUSION_NODE_IDENTITY_KEYS,
|
|
23
|
+
FUSION_WL_ITERATIONS,
|
|
24
|
+
graph_identity_digest,
|
|
25
|
+
graphs_exactly_equivalent,
|
|
26
|
+
)
|
|
27
|
+
from .interface import (
|
|
28
|
+
DEFAULT_INTERFACE_EDGE_KEYS,
|
|
29
|
+
DEFAULT_INTERFACE_NODE_KEYS,
|
|
30
|
+
FusionInterface,
|
|
31
|
+
FusionInterfaceError,
|
|
32
|
+
FusionInterfaceIssue,
|
|
33
|
+
FusionInterfaceIssueCode,
|
|
34
|
+
)
|
|
35
|
+
from .search import (
|
|
36
|
+
FusionProposal,
|
|
37
|
+
FusionSearchCounts,
|
|
38
|
+
FusionSearchResult,
|
|
39
|
+
VerifiedFusionSearch,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
__all__ = [
|
|
43
|
+
"DEFAULT_INTERFACE_EDGE_KEYS",
|
|
44
|
+
"DEFAULT_INTERFACE_NODE_KEYS",
|
|
45
|
+
"EndpointCertificate",
|
|
46
|
+
"FUSION_EDGE_IDENTITY_KEYS",
|
|
47
|
+
"FUSION_NODE_IDENTITY_KEYS",
|
|
48
|
+
"FUSION_WL_ITERATIONS",
|
|
49
|
+
"FUSION_PROOF_SCHEMA",
|
|
50
|
+
"FusionCandidate",
|
|
51
|
+
"FusionConstruction",
|
|
52
|
+
"FusionConstructionError",
|
|
53
|
+
"FusionConstructionIssue",
|
|
54
|
+
"FusionConstructionIssueCode",
|
|
55
|
+
"FusionInterface",
|
|
56
|
+
"FusionInterfaceError",
|
|
57
|
+
"FusionInterfaceIssue",
|
|
58
|
+
"FusionInterfaceIssueCode",
|
|
59
|
+
"FusionProposal",
|
|
60
|
+
"FusionProvenance",
|
|
61
|
+
"FusionScore",
|
|
62
|
+
"FusionSearchCounts",
|
|
63
|
+
"FusionSearchResult",
|
|
64
|
+
"VerifiedFusionSearch",
|
|
65
|
+
"construct_pushout",
|
|
66
|
+
"default_fusion_score",
|
|
67
|
+
"fusion_candidate_from_construction",
|
|
68
|
+
"fusion_candidates_exactly_equivalent",
|
|
69
|
+
"graph_identity_digest",
|
|
70
|
+
"graphs_exactly_equivalent",
|
|
71
|
+
]
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"""Proof-bearing verified-fusion result values."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from typing import Any, Mapping
|
|
9
|
+
|
|
10
|
+
import networkx as nx
|
|
11
|
+
|
|
12
|
+
from .constructor import EndpointCertificate, FusionConstruction, FusionProvenance
|
|
13
|
+
from .identity import graph_identity_digest, graphs_exactly_equivalent, stable_value
|
|
14
|
+
from .interface import FusionInterface
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
FUSION_PROOF_SCHEMA = "synkit.fusion-proof/1"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True, order=True)
|
|
21
|
+
class FusionScore:
|
|
22
|
+
"""Interpretable structural penalties; lower values rank first."""
|
|
23
|
+
|
|
24
|
+
unresolved_wildcards: int
|
|
25
|
+
added_nodes: int
|
|
26
|
+
added_edges: int
|
|
27
|
+
|
|
28
|
+
def to_dict(self) -> dict[str, int]:
|
|
29
|
+
return {
|
|
30
|
+
"unresolved_wildcards": self.unresolved_wildcards,
|
|
31
|
+
"added_nodes": self.added_nodes,
|
|
32
|
+
"added_edges": self.added_edges,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass(frozen=True)
|
|
37
|
+
class FusionCandidate:
|
|
38
|
+
"""A valid graph completion plus reproducible construction evidence."""
|
|
39
|
+
|
|
40
|
+
its: nx.Graph = field(compare=False, repr=False)
|
|
41
|
+
rsmi: str | None
|
|
42
|
+
interface: FusionInterface
|
|
43
|
+
wildcard_substitution: tuple[tuple[Any, tuple[Any, ...]], ...]
|
|
44
|
+
validation: tuple[Mapping[str, Any], ...]
|
|
45
|
+
endpoint_proof: EndpointCertificate
|
|
46
|
+
provenance: FusionProvenance
|
|
47
|
+
canonical_signature: str
|
|
48
|
+
proof_digest: str
|
|
49
|
+
score: FusionScore | None = None
|
|
50
|
+
proof_schema: str = FUSION_PROOF_SCHEMA
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def forward_morphism(self):
|
|
54
|
+
return self.interface.forward_morphism
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def backward_morphism(self):
|
|
58
|
+
return self.interface.backward_morphism
|
|
59
|
+
|
|
60
|
+
def to_dict(self) -> dict[str, Any]:
|
|
61
|
+
return {
|
|
62
|
+
"proof_schema": self.proof_schema,
|
|
63
|
+
"rsmi": self.rsmi,
|
|
64
|
+
"interface": self.interface.to_dict(),
|
|
65
|
+
"wildcard_substitution": [
|
|
66
|
+
{"interface_node": repr(node), "constraint": stable_value(value)}
|
|
67
|
+
for node, value in self.wildcard_substitution
|
|
68
|
+
],
|
|
69
|
+
"validation": [stable_value(item) for item in self.validation],
|
|
70
|
+
"endpoint_proof": self.endpoint_proof.to_dict(),
|
|
71
|
+
"provenance": self.provenance.to_dict(),
|
|
72
|
+
"canonical_signature": self.canonical_signature,
|
|
73
|
+
"proof_digest": self.proof_digest,
|
|
74
|
+
"score": self.score.to_dict() if self.score is not None else None,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _proof_digest(
|
|
79
|
+
construction: FusionConstruction,
|
|
80
|
+
graph_signature: str,
|
|
81
|
+
validation: tuple[Mapping[str, Any], ...],
|
|
82
|
+
) -> str:
|
|
83
|
+
validation_digest = []
|
|
84
|
+
for item in validation:
|
|
85
|
+
evidence = item.get("evidence", {})
|
|
86
|
+
validation_digest.append(
|
|
87
|
+
{
|
|
88
|
+
"valid": item.get("valid"),
|
|
89
|
+
"issues": [
|
|
90
|
+
{
|
|
91
|
+
"code": issue.get("code"),
|
|
92
|
+
"stage": issue.get("stage"),
|
|
93
|
+
}
|
|
94
|
+
for issue in item.get("issues", ())
|
|
95
|
+
],
|
|
96
|
+
"matcher": evidence.get("matcher"),
|
|
97
|
+
"stereo_policy": evidence.get("stereo_policy"),
|
|
98
|
+
"reactant_embeddings": len(evidence.get("reactant_embeddings", ())),
|
|
99
|
+
"product_embeddings": len(evidence.get("product_embeddings", ())),
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
payload = {
|
|
103
|
+
"schema": FUSION_PROOF_SCHEMA,
|
|
104
|
+
"interface": stable_value(construction.interface.canonical_signature()),
|
|
105
|
+
"graph": graph_signature,
|
|
106
|
+
"wildcards": stable_value(construction.provenance.wildcard_substitutions),
|
|
107
|
+
"endpoint": construction.endpoint_certificate.digest_payload(),
|
|
108
|
+
"validation": validation_digest,
|
|
109
|
+
}
|
|
110
|
+
encoded = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode()
|
|
111
|
+
return hashlib.sha256(encoded).hexdigest()
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def default_fusion_score(construction: FusionConstruction) -> FusionScore:
|
|
115
|
+
"""Rank valid constructions by transparent structural penalties only."""
|
|
116
|
+
graph = construction.graph
|
|
117
|
+
wildcard_count = sum(
|
|
118
|
+
attributes.get("element") in {"*", ("*", "*")}
|
|
119
|
+
for _, attributes in graph.nodes(data=True)
|
|
120
|
+
)
|
|
121
|
+
interface_nodes = len(construction.interface.interface_nodes)
|
|
122
|
+
interface_edges = len(construction.interface.edges)
|
|
123
|
+
return FusionScore(
|
|
124
|
+
wildcard_count,
|
|
125
|
+
graph.number_of_nodes() - interface_nodes,
|
|
126
|
+
graph.number_of_edges() - interface_edges,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def fusion_candidate_from_construction(
|
|
131
|
+
construction: FusionConstruction,
|
|
132
|
+
*,
|
|
133
|
+
rsmi: str | None = None,
|
|
134
|
+
validation: tuple[Mapping[str, Any], ...] = (),
|
|
135
|
+
score: FusionScore | None = None,
|
|
136
|
+
graph: nx.Graph | None = None,
|
|
137
|
+
) -> FusionCandidate:
|
|
138
|
+
"""Create an immutable proof-bearing candidate from a valid construction."""
|
|
139
|
+
candidate_graph = construction.graph if graph is None else graph
|
|
140
|
+
signature = graph_identity_digest(candidate_graph)
|
|
141
|
+
wildcard_substitution = construction.provenance.wildcard_substitutions
|
|
142
|
+
return FusionCandidate(
|
|
143
|
+
candidate_graph.copy(),
|
|
144
|
+
rsmi,
|
|
145
|
+
construction.interface,
|
|
146
|
+
wildcard_substitution,
|
|
147
|
+
tuple(dict(item) for item in validation),
|
|
148
|
+
construction.endpoint_certificate,
|
|
149
|
+
construction.provenance,
|
|
150
|
+
signature,
|
|
151
|
+
_proof_digest(construction, signature, validation),
|
|
152
|
+
score or default_fusion_score(construction),
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def fusion_candidates_exactly_equivalent(
|
|
157
|
+
left: FusionCandidate,
|
|
158
|
+
right: FusionCandidate,
|
|
159
|
+
) -> bool:
|
|
160
|
+
"""Reject hash-only deduplication; prove graph and substitution equality."""
|
|
161
|
+
if left.canonical_signature != right.canonical_signature:
|
|
162
|
+
return False
|
|
163
|
+
if left.wildcard_substitution != right.wildcard_substitution:
|
|
164
|
+
return False
|
|
165
|
+
return graphs_exactly_equivalent(left.its, right.its)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
__all__ = [
|
|
169
|
+
"FUSION_PROOF_SCHEMA",
|
|
170
|
+
"FusionCandidate",
|
|
171
|
+
"FusionScore",
|
|
172
|
+
"default_fusion_score",
|
|
173
|
+
"fusion_candidate_from_construction",
|
|
174
|
+
"fusion_candidates_exactly_equivalent",
|
|
175
|
+
]
|