synkit 1.6.5__py3-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- synkit/CRN/Benchmark/__init__.py +53 -0
- synkit/CRN/Benchmark/crosschecks.py +13 -0
- synkit/CRN/Benchmark/kegg.py +12 -0
- synkit/CRN/Benchmark/networks.py +13 -0
- synkit/CRN/Benchmark/scaling.py +13 -0
- synkit/CRN/Benchmark/validate.py +13 -0
- synkit/CRN/Construct/__init__.py +16 -0
- synkit/CRN/Construct/abstract.py +668 -0
- synkit/CRN/Construct/arity.py +36 -0
- synkit/CRN/Construct/builder.py +619 -0
- synkit/CRN/Construct/derivation.py +63 -0
- synkit/CRN/Construct/flattener.py +100 -0
- synkit/CRN/Construct/keys.py +14 -0
- synkit/CRN/Construct/mixtures.py +117 -0
- synkit/CRN/Construct/rdkit_worker.py +69 -0
- synkit/CRN/Construct/smiles.py +99 -0
- synkit/CRN/Construct/state.py +31 -0
- synkit/CRN/Construct/strategy.py +75 -0
- synkit/CRN/Construct/worker.py +42 -0
- synkit/CRN/IO/__init__.py +36 -0
- synkit/CRN/IO/sbml.py +925 -0
- synkit/CRN/Pathway/__init__.py +72 -0
- synkit/CRN/Pathway/_adapter.py +333 -0
- synkit/CRN/Pathway/pathfinder.py +500 -0
- synkit/CRN/Pathway/reachability.py +796 -0
- synkit/CRN/Pathway/realizability.py +1322 -0
- synkit/CRN/Petrinet/__init__.py +93 -0
- synkit/CRN/Petrinet/analyzer.py +486 -0
- synkit/CRN/Petrinet/minimal_semiflows.py +436 -0
- synkit/CRN/Petrinet/net.py +1041 -0
- synkit/CRN/Petrinet/persistence.py +97 -0
- synkit/CRN/Petrinet/semiflows.py +483 -0
- synkit/CRN/Petrinet/siphon_search.py +402 -0
- synkit/CRN/Petrinet/structure.py +286 -0
- synkit/CRN/Props/__init__.py +130 -0
- synkit/CRN/Props/_rank.py +29 -0
- synkit/CRN/Props/deficiency.py +953 -0
- synkit/CRN/Props/dynamics.py +832 -0
- synkit/CRN/Props/helper.py +151 -0
- synkit/CRN/Props/stoich.py +751 -0
- synkit/CRN/Props/thermo.py +584 -0
- synkit/CRN/Query/__init__.py +66 -0
- synkit/CRN/Query/cache.py +41 -0
- synkit/CRN/Query/kegg_api.py +99 -0
- synkit/CRN/Query/kegg_extract.py +714 -0
- synkit/CRN/Query/kegg_impute.py +707 -0
- synkit/CRN/Query/kegg_parse.py +480 -0
- synkit/CRN/Query/to_syncrn.py +290 -0
- synkit/CRN/README.md +234 -0
- synkit/CRN/Structure/__init__.py +12 -0
- synkit/CRN/Structure/_graph_io.py +713 -0
- synkit/CRN/Structure/_matrices.py +88 -0
- synkit/CRN/Structure/_parse.py +544 -0
- synkit/CRN/Structure/reaction.py +237 -0
- synkit/CRN/Structure/rule.py +55 -0
- synkit/CRN/Structure/species.py +46 -0
- synkit/CRN/Structure/syncrn.py +929 -0
- synkit/CRN/Symmetry/__init__.py +20 -0
- synkit/CRN/Symmetry/_common.py +1059 -0
- synkit/CRN/Symmetry/_ir.py +940 -0
- synkit/CRN/Symmetry/automorphism.py +472 -0
- synkit/CRN/Symmetry/canon.py +441 -0
- synkit/CRN/Symmetry/isomorphism.py +412 -0
- synkit/CRN/Symmetry/symmetry.py +61 -0
- synkit/CRN/Symmetry/wl_canon.py +967 -0
- synkit/CRN/Visualize/__init__.py +11 -0
- synkit/CRN/Visualize/labels.py +113 -0
- synkit/CRN/Visualize/layout.py +708 -0
- synkit/CRN/Visualize/palette.py +292 -0
- synkit/CRN/Visualize/validation.py +122 -0
- synkit/CRN/Visualize/vis.py +1152 -0
- synkit/CRN/__init__.py +233 -0
- synkit/CRN/_build.py +50 -0
- synkit/CRN/_native_build.py +175 -0
- synkit/CRN/analysis.py +629 -0
- synkit/CRN/backend.py +74 -0
- synkit/CRN/cpp/CMakeLists.txt +58 -0
- synkit/CRN/cpp/algebra.cpp +46 -0
- synkit/CRN/cpp/closure.cpp +29 -0
- synkit/CRN/cpp/exact.h +55 -0
- synkit/CRN/cpp/pathway.cpp +46 -0
- synkit/CRN/cpp/semiflows.cpp +209 -0
- synkit/CRN/cpp/structural.cpp +240 -0
- synkit/CRN/cpp/symmetry.cpp +45 -0
- synkit/CRN/cpp/write_manifest.cmake +28 -0
- synkit/CRN/kinds.py +137 -0
- synkit/CRN/lib/synkit_crn.dll +0 -0
- synkit/CRN/lib/synkit_crn.json +33 -0
- synkit/CRN/native.py +388 -0
- synkit/CRN/native_analysis.py +459 -0
- synkit/Chem/Cluster/__init__.py +0 -0
- synkit/Chem/Cluster/butina.py +140 -0
- synkit/Chem/Fingerprint/__init__.py +0 -0
- synkit/Chem/Fingerprint/fp_calculator.py +155 -0
- synkit/Chem/Fingerprint/smiles_featurizer.py +258 -0
- synkit/Chem/Fingerprint/transformation_fp.py +139 -0
- synkit/Chem/Mapper/README.rst +43 -0
- synkit/Chem/Mapper/__init__.py +255 -0
- synkit/Chem/Mapper/_compat.py +130 -0
- synkit/Chem/Mapper/adapters/__init__.py +1 -0
- synkit/Chem/Mapper/adapters/prediction.py +126 -0
- synkit/Chem/Mapper/adapters/template.py +412 -0
- synkit/Chem/Mapper/chem/__init__.py +52 -0
- synkit/Chem/Mapper/chem/aam.py +673 -0
- synkit/Chem/Mapper/chem/blind.py +160 -0
- synkit/Chem/Mapper/chem/its.py +309 -0
- synkit/Chem/Mapper/chem/smiles.py +564 -0
- synkit/Chem/Mapper/graph/__init__.py +66 -0
- synkit/Chem/Mapper/graph/automorphism.py +395 -0
- synkit/Chem/Mapper/graph/blockcut.py +98 -0
- synkit/Chem/Mapper/graph/labeled_graph.py +104 -0
- synkit/Chem/Mapper/graph/refine.py +176 -0
- synkit/Chem/Mapper/graph/synkit_adapter.py +110 -0
- synkit/Chem/Mapper/io/__init__.py +13 -0
- synkit/Chem/Mapper/io/idxmapstr.py +82 -0
- synkit/Chem/Mapper/mapper.py +685 -0
- synkit/Chem/Mapper/reaction_search.py +554 -0
- synkit/Chem/Mapper/reporting/__init__.py +1 -0
- synkit/Chem/Mapper/reporting/alternatives.py +451 -0
- synkit/Chem/Mapper/reporting/analysis.py +681 -0
- synkit/Chem/Mapper/reporting/native_analysis.py +485 -0
- synkit/Chem/Mapper/reporting/spectrum.py +642 -0
- synkit/Chem/Mapper/solvers/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/__init__.py +141 -0
- synkit/Chem/Mapper/solvers/exact/assignment/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_certificate.py +113 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_domains.py +162 -0
- synkit/Chem/Mapper/solvers/exact/assignment/assignment_verification.py +58 -0
- synkit/Chem/Mapper/solvers/exact/assignment/incremental_assignment.py +247 -0
- synkit/Chem/Mapper/solvers/exact/certificate.py +128 -0
- synkit/Chem/Mapper/solvers/exact/core.py +183 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/bounds.py +319 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/exhaustive.py +179 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/inputs.py +283 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/records.py +242 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/search.py +1025 -0
- synkit/Chem/Mapper/solvers/exact/distance_search/verify.py +378 -0
- synkit/Chem/Mapper/solvers/exact/edit_support.py +375 -0
- synkit/Chem/Mapper/solvers/exact/hybrid.py +224 -0
- synkit/Chem/Mapper/solvers/exact/hydrogen.py +264 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/branching.py +499 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/enumerate.py +1050 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/enumeration_result.py +30 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/kernel.py +256 -0
- synkit/Chem/Mapper/solvers/exact/kernel_solvers/milp.py +194 -0
- synkit/Chem/Mapper/solvers/exact/native/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/native/build.py +154 -0
- synkit/Chem/Mapper/solvers/exact/native/candidates.py +593 -0
- synkit/Chem/Mapper/solvers/exact/native/canonical.py +396 -0
- synkit/Chem/Mapper/solvers/exact/native/disk_frontier.py +415 -0
- synkit/Chem/Mapper/solvers/exact/native/frontier.py +390 -0
- synkit/Chem/Mapper/solvers/exact/native/hydrogen_quotient.py +213 -0
- synkit/Chem/Mapper/solvers/exact/native/its.py +528 -0
- synkit/Chem/Mapper/solvers/exact/native/native_distance.cpp +2803 -0
- synkit/Chem/Mapper/solvers/exact/native/orbit_aggregation.py +328 -0
- synkit/Chem/Mapper/solvers/exact/native/parallel.py +205 -0
- synkit/Chem/Mapper/solvers/exact/native/pmcd.py +203 -0
- synkit/Chem/Mapper/solvers/exact/native/runtime.py +40 -0
- synkit/Chem/Mapper/solvers/exact/native/search.py +294 -0
- synkit/Chem/Mapper/solvers/exact/native/separator.py +224 -0
- synkit/Chem/Mapper/solvers/exact/native_build.py +12 -0
- synkit/Chem/Mapper/solvers/exact/pabs/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/pabs/cost_lattice.py +43 -0
- synkit/Chem/Mapper/solvers/exact/pabs/factor_spectrum.py +110 -0
- synkit/Chem/Mapper/solvers/exact/pabs/multi_shell.py +368 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation.py +679 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_bounds.py +436 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_limits.py +13 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_search.py +856 -0
- synkit/Chem/Mapper/solvers/exact/pabs/propagation_symmetry.py +66 -0
- synkit/Chem/Mapper/solvers/exact/pabs/residual_typed_bonds.py +136 -0
- synkit/Chem/Mapper/solvers/exact/pabs/reward_frontier.py +201 -0
- synkit/Chem/Mapper/solvers/exact/pabs/separator_bound.py +258 -0
- synkit/Chem/Mapper/solvers/exact/pabs/separator_spectrum.py +308 -0
- synkit/Chem/Mapper/solvers/exact/pabs/sparse_reward_bound.py +207 -0
- synkit/Chem/Mapper/solvers/exact/pabs/suffix_spectrum.py +299 -0
- synkit/Chem/Mapper/solvers/exact/search.py +55 -0
- synkit/Chem/Mapper/solvers/exact/seeds/__init__.py +1 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed.py +104 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed_fragments.py +148 -0
- synkit/Chem/Mapper/solvers/exact/seeds/seed_relaxation.py +181 -0
- synkit/Chem/Mapper/solvers/exact/symmetry.py +223 -0
- synkit/Chem/Mapper/solvers/native/__init__.py +4 -0
- synkit/Chem/Mapper/solvers/native/assignment.py +99 -0
- synkit/Chem/Mapper/solvers/native/astar.py +22 -0
- synkit/Chem/Mapper/solvers/native/build.py +385 -0
- synkit/Chem/Mapper/solvers/native/classification.py +641 -0
- synkit/Chem/Mapper/solvers/native/core.py +378 -0
- synkit/Chem/Mapper/solvers/native/cpp/CMakeLists.txt +120 -0
- synkit/Chem/Mapper/solvers/native/cpp/examples/map_reaction.cpp +29 -0
- synkit/Chem/Mapper/solvers/native/cpp/examples/slap_graph.cpp +63 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/assignment/assignment.h +18 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/astar/astar.h +18 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/astar/bound.h +33 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/core/pmcd_witness.h +16 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/core/runtime.h +130 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/hydrogen/hydrogen.h +73 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/mapper.h +175 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/mces/mces.h +9 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/pabs/seed.h +34 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/reaction/reaction.h +30 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/sepdp/sepdp.h +21 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/slap.h +72 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/solvers/solvers.h +16 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/symmetry/classification.h +140 -0
- synkit/Chem/Mapper/solvers/native/cpp/include/synkit_mapper/symmetry/cpabs.h +33 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/assignment/abb.cpp +302 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/CMakeLists.txt +12 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/README.md +47 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/astar.cpp +228 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/astar_graph.cpp +37 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/astar/bound.cpp +212 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/core/dispatch.cpp +272 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/core/pmcd_witness.cpp +36 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/hydrogen/hydrogen.cpp +380 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/mces/README.md +57 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/mces/mces.cpp +287 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/bridge.cpp +334 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/chemical_floor.inc +181 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/endpoint_symmetry.inc +104 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/exact_helpers.h +20 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_assignment_certificate.h +165 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_certificate.h +125 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_model.h +365 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_provider.inc +319 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_rounding.inc +170 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/lp_test_hooks.h +342 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/objective_reduction.inc +137 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/overlap_dual.inc +351 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/profile_seed.inc +214 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/seed_heuristics.inc +640 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/sparse_embedding.cpp +430 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/sparse_root_lp.h +176 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/pabs/test_hooks.inc +262 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/reaction/reaction.cpp +611 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/sepdp/README.md +61 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/sepdp/sepdp.cpp +253 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/slap.cpp +810 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/formulation.h +138 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/maxsat.cpp +526 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/ortools.cpp +475 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/seed.h +80 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/solvers/weighted_cnf.h +256 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/README.md +43 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/dfs.cpp +123 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/supporting/edit_support.cpp +224 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification.cpp +553 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification_pipeline.cpp +124 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/classification_stream.h +13 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/cpabs.cpp +455 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/edge_deck.cpp +743 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/COPYRIGHT +44 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/LICENSE-2.0.txt +202 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naugraph.c +732 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naurng.c +94 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naurng.h +49 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nausparse.c +1771 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nausparse.h +133 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nautil.c +750 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/naututil.h +355 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nauty.c +1256 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/nauty.h +1544 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/schreier.c +1131 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/schreier.h +70 -0
- synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/sorttemplates.c +580 -0
- synkit/Chem/Mapper/solvers/native/hydrogen.py +711 -0
- synkit/Chem/Mapper/solvers/native/implicit.py +506 -0
- synkit/Chem/Mapper/solvers/native/implicit_certificate.py +187 -0
- synkit/Chem/Mapper/solvers/native/implicit_preparation.py +309 -0
- synkit/Chem/Mapper/solvers/native/lib/synkit_mapper.dll +0 -0
- synkit/Chem/Mapper/solvers/native/mces.py +16 -0
- synkit/Chem/Mapper/solvers/native/reaction.py +179 -0
- synkit/Chem/Mapper/solvers/native/reaction_build.py +277 -0
- synkit/Chem/Mapper/solvers/native/reaction_text.py +26 -0
- synkit/Chem/Mapper/solvers/native/runtime.py +242 -0
- synkit/Chem/Mapper/solvers/native/sepdp.py +47 -0
- synkit/Chem/Mapper/solvers/native/slap.py +266 -0
- synkit/Chem/Mapper/solvers/native/solvers.py +67 -0
- synkit/Chem/Mapper/solvers/native/stereo.py +86 -0
- synkit/Chem/Mapper/solvers/native/supporting.py +34 -0
- synkit/Chem/Mapper/solvers/native/symmetry.py +91 -0
- synkit/Chem/Mapper/solvers/slap/__init__.py +29 -0
- synkit/Chem/Mapper/solvers/slap/lap.py +174 -0
- synkit/Chem/Mapper/solvers/slap/sequential.py +696 -0
- synkit/Chem/Mapper/validation/__init__.py +1 -0
- synkit/Chem/Mapper/validation/aam_validator.py +442 -0
- synkit/Chem/Mapper/validation/annotations.py +274 -0
- synkit/Chem/Mapper/validation/bonds.py +124 -0
- synkit/Chem/Mapper/validation/cohorts.py +72 -0
- synkit/Chem/Mapper/validation/identifiability.py +150 -0
- synkit/Chem/Mapper/validation/numerical_scope.py +36 -0
- synkit/Chem/Mapper/validation/orbits.py +137 -0
- synkit/Chem/Molecule/__init__.py +0 -0
- synkit/Chem/Molecule/_chirality_loci.py +165 -0
- synkit/Chem/Molecule/_chirality_types.py +231 -0
- synkit/Chem/Molecule/_helical_loci.py +167 -0
- synkit/Chem/Molecule/_stereo_axis_evidence.py +202 -0
- synkit/Chem/Molecule/_stereo_element_detection.py +193 -0
- synkit/Chem/Molecule/_stereo_orientation_constraints.py +511 -0
- synkit/Chem/Molecule/_tetrahedral_carriers.py +63 -0
- synkit/Chem/Molecule/atom_features.py +379 -0
- synkit/Chem/Molecule/chirality.py +1041 -0
- synkit/Chem/Molecule/cip_assignment.py +569 -0
- synkit/Chem/Molecule/cip_ranking.py +843 -0
- synkit/Chem/Molecule/coordinate_stereo.py +503 -0
- synkit/Chem/Molecule/derived_stereo_naming.py +165 -0
- synkit/Chem/Molecule/descriptors.py +452 -0
- synkit/Chem/Molecule/formula.py +249 -0
- synkit/Chem/Molecule/global_stereo.py +175 -0
- synkit/Chem/Molecule/graph_annotator.py +300 -0
- synkit/Chem/Molecule/standardize.py +817 -0
- synkit/Chem/Molecule/stereo_evidence.py +179 -0
- synkit/Chem/Molecule/stereo_perception.py +1032 -0
- synkit/Chem/Molecule/valence.py +123 -0
- synkit/Chem/Reaction/Mapper/__init__.py +44 -0
- synkit/Chem/Reaction/__init__.py +20 -0
- synkit/Chem/Reaction/aam_validator.py +5 -0
- synkit/Chem/Reaction/balance_check.py +138 -0
- synkit/Chem/Reaction/canon_rsmi.py +249 -0
- synkit/Chem/Reaction/cleaning.py +58 -0
- synkit/Chem/Reaction/deionize.py +199 -0
- synkit/Chem/Reaction/explicit_h_audit.py +232 -0
- synkit/Chem/Reaction/fix_aam.py +64 -0
- synkit/Chem/Reaction/neutralize.py +207 -0
- synkit/Chem/Reaction/radical_wildcard.py +224 -0
- synkit/Chem/Reaction/standardize.py +203 -0
- synkit/Chem/Reaction/tautomerize.py +205 -0
- synkit/Chem/__init__.py +1 -0
- synkit/Chem/utils.py +315 -0
- synkit/Data/__init__.py +0 -0
- synkit/Data/aldol.json.gz +1 -0
- synkit/Data/gen_partial_aam.py +147 -0
- synkit/Data/paracetamol.json.gz +1 -0
- synkit/Graph/Canon/__init__.py +16 -0
- synkit/Graph/Canon/_native/__init__.py +13 -0
- synkit/Graph/Canon/_native/build.py +93 -0
- synkit/Graph/Canon/_native/lib/synkit_canon.dll +0 -0
- synkit/Graph/Canon/_native/prepare.py +49 -0
- synkit/Graph/Canon/_native/runtime.py +140 -0
- synkit/Graph/Canon/_native/search.py +137 -0
- synkit/Graph/Canon/canon_algs.py +228 -0
- synkit/Graph/Canon/canon_graph.py +531 -0
- synkit/Graph/Canon/cpp/CMakeLists.txt +42 -0
- synkit/Graph/Canon/cpp/README.md +123 -0
- synkit/Graph/Canon/cpp/examples/canonical_graph.cpp +16 -0
- synkit/Graph/Canon/cpp/include/synkit_canon/canon.h +85 -0
- synkit/Graph/Canon/cpp/src/canonical.cpp +391 -0
- synkit/Graph/Canon/cpp/src/symmetry.h +83 -0
- synkit/Graph/Canon/cpp/tests/symmetry.cpp +93 -0
- synkit/Graph/Canon/exact.py +1020 -0
- synkit/Graph/Canon/exact_refinement.py +368 -0
- synkit/Graph/Canon/nauty.py +143 -0
- synkit/Graph/Context/__init__.py +0 -0
- synkit/Graph/Context/hier_context.py +244 -0
- synkit/Graph/Context/radius_expand.py +252 -0
- synkit/Graph/FG/__init__.py +19 -0
- synkit/Graph/FG/api.py +39 -0
- synkit/Graph/FG/audit.py +155 -0
- synkit/Graph/FG/catalog.py +919 -0
- synkit/Graph/FG/detector.py +288 -0
- synkit/Graph/FG/model.py +97 -0
- synkit/Graph/FG/recognizers.py +274 -0
- synkit/Graph/FG/ring_system.py +154 -0
- synkit/Graph/Feature/Descriptors/topology.py +857 -0
- synkit/Graph/Feature/Fingerprint/__init__.py +0 -0
- synkit/Graph/Feature/Fingerprint/wl_rxn_fps.py +222 -0
- synkit/Graph/Feature/__init__.py +5 -0
- synkit/Graph/Feature/graph_descriptors.py +323 -0
- synkit/Graph/Feature/graph_fps.py +96 -0
- synkit/Graph/Feature/graph_signature.py +239 -0
- synkit/Graph/Feature/hash_fps.py +133 -0
- synkit/Graph/Feature/morgan_fps.py +88 -0
- synkit/Graph/Feature/path_fps.py +81 -0
- synkit/Graph/Feature/wl_hash.py +134 -0
- synkit/Graph/Fusion/__init__.py +85 -0
- synkit/Graph/Fusion/candidate.py +559 -0
- synkit/Graph/Fusion/constructor.py +877 -0
- synkit/Graph/Fusion/identity.py +184 -0
- synkit/Graph/Fusion/interface.py +700 -0
- synkit/Graph/Fusion/search.py +241 -0
- synkit/Graph/Hyrogen/__init__.py +6 -0
- synkit/Graph/Hyrogen/_misc.py +591 -0
- synkit/Graph/Hyrogen/hcomplete.py +995 -0
- synkit/Graph/Hyrogen/hcomplete_legacy.py +368 -0
- synkit/Graph/Hyrogen/hcompletion_algorithms.py +713 -0
- synkit/Graph/Hyrogen/hextend.py +570 -0
- synkit/Graph/Hyrogen/hextend_legacy.py +215 -0
- synkit/Graph/ITS/__init__.py +4 -0
- synkit/Graph/ITS/its_builder.py +120 -0
- synkit/Graph/ITS/its_construction.py +719 -0
- synkit/Graph/ITS/its_decompose.py +572 -0
- synkit/Graph/ITS/its_destruction.py +331 -0
- synkit/Graph/ITS/its_expand.py +1251 -0
- synkit/Graph/ITS/its_relabel.py +187 -0
- synkit/Graph/ITS/its_reverter.py +356 -0
- synkit/Graph/ITS/normalize_aam.py +145 -0
- synkit/Graph/ITS/partial_its.py +238 -0
- synkit/Graph/ITS/rc_extractor.py +656 -0
- synkit/Graph/ITS/stereo.py +74 -0
- synkit/Graph/MTG/__init__.py +107 -0
- synkit/Graph/MTG/gluing.py +451 -0
- synkit/Graph/MTG/history.py +928 -0
- synkit/Graph/MTG/inventory.py +118 -0
- synkit/Graph/MTG/local.py +447 -0
- synkit/Graph/MTG/mcs_matcher.py +246 -0
- synkit/Graph/MTG/mtg.py +611 -0
- synkit/Graph/MTG/mtg_explore.py +74 -0
- synkit/Graph/MTG/observation.py +209 -0
- synkit/Graph/MTG/process.py +577 -0
- synkit/Graph/MTG/queries.py +66 -0
- synkit/Graph/MTG/realization.py +95 -0
- synkit/Graph/MTG/series_parallel.py +107 -0
- synkit/Graph/MTG/utils.py +424 -0
- synkit/Graph/Matcher/__init__.py +10 -0
- synkit/Graph/Matcher/approx_mcs.py +1264 -0
- synkit/Graph/Matcher/auto_est.py +736 -0
- synkit/Graph/Matcher/automorphism.py +314 -0
- synkit/Graph/Matcher/batch_cluster.py +224 -0
- synkit/Graph/Matcher/dedup_matches.py +247 -0
- synkit/Graph/Matcher/graph_cluster.py +191 -0
- synkit/Graph/Matcher/graph_matcher.py +312 -0
- synkit/Graph/Matcher/graph_morphism.py +421 -0
- synkit/Graph/Matcher/mcs_matcher.py +804 -0
- synkit/Graph/Matcher/multi_turbo_iso.py +186 -0
- synkit/Graph/Matcher/orbit.py +284 -0
- synkit/Graph/Matcher/partial_matcher.py +694 -0
- synkit/Graph/Matcher/sing.py +544 -0
- synkit/Graph/Matcher/subgraph_matcher.py +812 -0
- synkit/Graph/Matcher/turbo_iso.py +272 -0
- synkit/Graph/Matcher/wl_sel.py +537 -0
- synkit/Graph/Mech/__init__.py +26 -0
- synkit/Graph/Mech/conversion.py +1466 -0
- synkit/Graph/Mech/conversion_debug.py +237 -0
- synkit/Graph/Mech/electron_accounting.py +200 -0
- synkit/Graph/Mech/lwg_editor.py +406 -0
- synkit/Graph/Mech/lwg_ops.py +313 -0
- synkit/Graph/Morphism/__init__.py +99 -0
- synkit/Graph/Morphism/constraints.py +460 -0
- synkit/Graph/Morphism/llg.py +999 -0
- synkit/Graph/Morphism/morphism.py +349 -0
- synkit/Graph/Morphism/stereo.py +258 -0
- synkit/Graph/Morphism/stereo_morphism.py +383 -0
- synkit/Graph/Morphism/stereo_morphism_helpers.py +957 -0
- synkit/Graph/Morphism/stereo_morphism_types.py +117 -0
- synkit/Graph/Stereo/__init__.py +376 -0
- synkit/Graph/Stereo/_descriptor_core.py +207 -0
- synkit/Graph/Stereo/_descriptor_serialization.py +138 -0
- synkit/Graph/Stereo/canonical.py +648 -0
- synkit/Graph/Stereo/changes.py +964 -0
- synkit/Graph/Stereo/composition.py +391 -0
- synkit/Graph/Stereo/configured.py +946 -0
- synkit/Graph/Stereo/couplings.py +245 -0
- synkit/Graph/Stereo/descriptors.py +1030 -0
- synkit/Graph/Stereo/enumeration.py +597 -0
- synkit/Graph/Stereo/extended_descriptors.py +406 -0
- synkit/Graph/Stereo/global_configured.py +152 -0
- synkit/Graph/Stereo/global_stereo.py +304 -0
- synkit/Graph/Stereo/identity.py +648 -0
- synkit/Graph/Stereo/interchange.py +496 -0
- synkit/Graph/Stereo/legacy.py +460 -0
- synkit/Graph/Stereo/matching.py +899 -0
- synkit/Graph/Stereo/native.py +154 -0
- synkit/Graph/Stereo/orbits.py +668 -0
- synkit/Graph/Stereo/outcomes.py +99 -0
- synkit/Graph/Stereo/pairwise.py +350 -0
- synkit/Graph/Stereo/rdkit_adapter.py +662 -0
- synkit/Graph/Stereo/rdkit_identity.py +118 -0
- synkit/Graph/Stereo/rdkit_resonance.py +140 -0
- synkit/Graph/Stereo/reaction_interchange.py +266 -0
- synkit/Graph/Stereo/semantics.py +296 -0
- synkit/Graph/Stereo/supports.py +257 -0
- synkit/Graph/Stereo/wire.py +339 -0
- synkit/Graph/Wildcard/__init__.py +0 -0
- synkit/Graph/Wildcard/fuse_graph.py +156 -0
- synkit/Graph/Wildcard/graph_wc.py +303 -0
- synkit/Graph/Wildcard/its_merge.py +857 -0
- synkit/Graph/Wildcard/radwc.py +114 -0
- synkit/Graph/Wildcard/wc_matcher.py +576 -0
- synkit/Graph/Wildcard/wildcard.py +225 -0
- synkit/Graph/__init__.py +17 -0
- synkit/Graph/canon_graph.py +14 -0
- synkit/Graph/syn_graph.py +199 -0
- synkit/Graph/utils.py +324 -0
- synkit/IO/__init__.py +4 -0
- synkit/IO/chem_converter.py +1059 -0
- synkit/IO/combinatorial/__init__.py +8 -0
- synkit/IO/combinatorial/gml_to_graph.py +223 -0
- synkit/IO/combinatorial/graph_to_gml.py +280 -0
- synkit/IO/combinatorial/graph_to_smarts.py +186 -0
- synkit/IO/combinatorial/smarts_expander.py +147 -0
- synkit/IO/combinatorial/smarts_generalizer.py +133 -0
- synkit/IO/combinatorial/smarts_to_graph.py +179 -0
- synkit/IO/conversion.py +42 -0
- synkit/IO/data_io.py +269 -0
- synkit/IO/data_process.py +143 -0
- synkit/IO/debug.py +73 -0
- synkit/IO/gml_to_nx.py +150 -0
- synkit/IO/graph_to_mol.py +199 -0
- synkit/IO/mol_to_graph.py +1105 -0
- synkit/IO/mol_to_graph_chemistry.py +545 -0
- synkit/IO/nx_to_gml.py +209 -0
- synkit/IO/smiles_to_id.py +123 -0
- synkit/Mechanism/__init__.py +151 -0
- synkit/Mechanism/adapters.py +136 -0
- synkit/Mechanism/audit.py +323 -0
- synkit/Mechanism/benchmark.py +638 -0
- synkit/Mechanism/compatibility.py +13 -0
- synkit/Mechanism/drawing.py +85 -0
- synkit/Mechanism/electron_models.py +725 -0
- synkit/Mechanism/equivalence.py +521 -0
- synkit/Mechanism/evidence.py +262 -0
- synkit/Mechanism/interchange.py +141 -0
- synkit/Mechanism/model.py +918 -0
- synkit/Mechanism/neighbor_stereo.py +312 -0
- synkit/Mechanism/radical_data.py +740 -0
- synkit/Mechanism/replay.py +986 -0
- synkit/Mechanism/schema.py +264 -0
- synkit/Mechanism/stereo_state.py +416 -0
- synkit/Mechanism/symbols.py +91 -0
- synkit/Rule/Apply/__init__.py +35 -0
- synkit/Rule/Apply/conditions.py +45 -0
- synkit/Rule/Apply/dpo.py +998 -0
- synkit/Rule/Apply/rule_matcher.py +218 -0
- synkit/Rule/Apply/validation.py +354 -0
- synkit/Rule/Compose/__init__.py +106 -0
- synkit/Rule/Compose/_identity.py +43 -0
- synkit/Rule/Compose/composition.py +976 -0
- synkit/Rule/Compose/laws.py +439 -0
- synkit/Rule/Compose/search.py +771 -0
- synkit/Rule/Compose/synrule.py +170 -0
- synkit/Rule/Modify/__init__.py +0 -0
- synkit/Rule/Modify/implict_rule.py +56 -0
- synkit/Rule/Modify/longest_path.py +92 -0
- synkit/Rule/Modify/molecule_rule.py +115 -0
- synkit/Rule/Modify/prune_templates.py +78 -0
- synkit/Rule/Modify/rule_utils.py +194 -0
- synkit/Rule/Modify/strip_rule.py +97 -0
- synkit/Rule/__init__.py +28 -0
- synkit/Rule/generic_stereo.py +884 -0
- synkit/Rule/stereo_identity.py +271 -0
- synkit/Rule/syn_rule.py +1090 -0
- synkit/Synthesis/MSR/__init__.py +0 -0
- synkit/Synthesis/MSR/path_finder.py +239 -0
- synkit/Synthesis/Metrics/__init__.py +0 -0
- synkit/Synthesis/Metrics/_base.py +52 -0
- synkit/Synthesis/Metrics/_plot.py +129 -0
- synkit/Synthesis/Metrics/_ranking.py +179 -0
- synkit/Synthesis/RBL/__init__.py +80 -0
- synkit/Synthesis/RBL/engine.py +1249 -0
- synkit/Synthesis/RBL/matching.py +652 -0
- synkit/Synthesis/RBL/overlap.py +336 -0
- synkit/Synthesis/RBL/pipeline.py +376 -0
- synkit/Synthesis/RBL/policy.py +139 -0
- synkit/Synthesis/RBL/proof.py +370 -0
- synkit/Synthesis/RBL/reaction.py +506 -0
- synkit/Synthesis/RBL/state.py +169 -0
- synkit/Synthesis/RBL/validation.py +1060 -0
- synkit/Synthesis/Reactor/__init__.py +60 -0
- synkit/Synthesis/Reactor/core/__init__.py +1 -0
- synkit/Synthesis/Reactor/core/engine.py +967 -0
- synkit/Synthesis/Reactor/core/product.py +621 -0
- synkit/Synthesis/Reactor/core/rewrite.py +561 -0
- synkit/Synthesis/Reactor/core/strategy.py +44 -0
- synkit/Synthesis/Reactor/matching/__init__.py +1 -0
- synkit/Synthesis/Reactor/matching/mixin.py +920 -0
- synkit/Synthesis/Reactor/matching/policy.py +345 -0
- synkit/Synthesis/Reactor/matching/symmetry.py +309 -0
- synkit/Synthesis/Reactor/output/__init__.py +1 -0
- synkit/Synthesis/Reactor/output/deduplication.py +703 -0
- synkit/Synthesis/Reactor/output/policy.py +16 -0
- synkit/Synthesis/Reactor/output/serialization.py +485 -0
- synkit/Synthesis/Reactor/output/structural.py +893 -0
- synkit/Synthesis/Reactor/stereo/__init__.py +1 -0
- synkit/Synthesis/Reactor/stereo/assignment.py +35 -0
- synkit/Synthesis/Reactor/stereo/mixin.py +780 -0
- synkit/Synthesis/Reactor/variants/__init__.py +1 -0
- synkit/Synthesis/Reactor/variants/imbalanced.py +180 -0
- synkit/Synthesis/Reactor/variants/partial.py +84 -0
- synkit/Synthesis/Reactor/workflow/__init__.py +1 -0
- synkit/Synthesis/Reactor/workflow/batch.py +550 -0
- synkit/Synthesis/Reactor/workflow/benchmark.py +143 -0
- synkit/Synthesis/Reactor/workflow/postprocess.py +267 -0
- synkit/Synthesis/Reactor/workflow/rule_filter.py +210 -0
- synkit/Synthesis/__init__.py +0 -0
- synkit/Synthesis/reactor_utils.py +316 -0
- synkit/Utils/__init__.py +0 -0
- synkit/Utils/utils.py +172 -0
- synkit/Vis/__init__.py +91 -0
- synkit/Vis/crn/__init__.py +40 -0
- synkit/Vis/epd/__init__.py +20 -0
- synkit/Vis/epd/arrows.py +425 -0
- synkit/Vis/epd/chem.py +197 -0
- synkit/Vis/epd/constants.py +83 -0
- synkit/Vis/epd/layout.py +283 -0
- synkit/Vis/epd/mapping.py +51 -0
- synkit/Vis/epd/models.py +136 -0
- synkit/Vis/epd/render.py +543 -0
- synkit/Vis/epd/utils.py +108 -0
- synkit/Vis/epd/visualizer.py +811 -0
- synkit/Vis/graph_visualizer.py +375 -0
- synkit/Vis/its/__init__.py +19 -0
- synkit/Vis/its/drawer.py +615 -0
- synkit/Vis/its_drawer.py +35 -0
- synkit/Vis/molecule/__init__.py +31 -0
- synkit/Vis/molecule/drawer.py +563 -0
- synkit/Vis/molecule/reaction.py +285 -0
- synkit/Vis/molecule_drawer.py +33 -0
- synkit/Vis/mtg/__init__.py +17 -0
- synkit/Vis/mtg/drawer.py +769 -0
- synkit/Vis/mtg_drawer.py +34 -0
- synkit/Vis/pdf_writer.py +146 -0
- synkit/Vis/reaction/__init__.py +19 -0
- synkit/Vis/reaction/rule.py +141 -0
- synkit/Vis/reaction/rxn.py +532 -0
- synkit/Vis/reaction_drawer.py +41 -0
- synkit/Vis/space/__init__.py +17 -0
- synkit/Vis/space/chemical.py +80 -0
- synkit/Vis/space/embedding.py +87 -0
- synkit/Vis/vis_synedu/Vis/__init__.py +7 -0
- synkit/Vis/vis_synedu/Vis/dpo.py +862 -0
- synkit/Vis/vis_synedu/rxn_vis.py +377 -0
- synkit/Vis/vis_synedu/vis.py +501 -0
- synkit/Vis/visual_drawer.py +215 -0
- synkit/Vis/visual_model.py +520 -0
- synkit/__init__.py +3 -0
- synkit/_native.py +91 -0
- synkit/examples.py +50 -0
- synkit/version.py +23 -0
- synkit-1.6.5.dist-info/METADATA +156 -0
- synkit-1.6.5.dist-info/RECORD +636 -0
- synkit-1.6.5.dist-info/WHEEL +4 -0
- synkit-1.6.5.dist-info/licenses/LICENSE +21 -0
- synkit-1.6.5.dist-info/licenses/synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/COPYRIGHT +44 -0
- synkit-1.6.5.dist-info/licenses/synkit/Chem/Mapper/solvers/native/cpp/src/symmetry/vendor/nauty/LICENSE-2.0.txt +202 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"""Validate exact-distance options and normalize conditioned mapping inputs."""
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
from numbers import Integral, Real
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
from ...slap.lap import _adjacency_and_elements
|
|
9
|
+
from .records import _input_sha256
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def validate_distance_options( # noqa: C901
|
|
13
|
+
*,
|
|
14
|
+
max_bijections,
|
|
15
|
+
tolerance,
|
|
16
|
+
time_limit_seconds,
|
|
17
|
+
symmetry_pruning,
|
|
18
|
+
expand_symmetry,
|
|
19
|
+
certify,
|
|
20
|
+
max_symmetry_automorphisms,
|
|
21
|
+
symmetry_timeout_seconds,
|
|
22
|
+
symmetry_max_search_nodes,
|
|
23
|
+
max_mappings,
|
|
24
|
+
assignment_lower_bound,
|
|
25
|
+
assignment_upper_bound,
|
|
26
|
+
atom_profile_pruning,
|
|
27
|
+
seed_center_order,
|
|
28
|
+
symmetry_node_properties,
|
|
29
|
+
collect_mappings,
|
|
30
|
+
mapping_callback,
|
|
31
|
+
compute_minimum_cost,
|
|
32
|
+
_optimization_only,
|
|
33
|
+
):
|
|
34
|
+
"""Reject invalid budgets and unsupported enumeration option combinations."""
|
|
35
|
+
if max_bijections is not None and (
|
|
36
|
+
isinstance(max_bijections, bool)
|
|
37
|
+
or not isinstance(max_bijections, Integral)
|
|
38
|
+
or max_bijections < 1
|
|
39
|
+
):
|
|
40
|
+
raise ValueError("max_bijections must be a positive integer or None")
|
|
41
|
+
if tolerance < 0 or not math.isfinite(tolerance):
|
|
42
|
+
raise ValueError("tolerance must be finite and non-negative")
|
|
43
|
+
if time_limit_seconds is not None and (
|
|
44
|
+
isinstance(time_limit_seconds, bool)
|
|
45
|
+
or not isinstance(time_limit_seconds, Real)
|
|
46
|
+
or not math.isfinite(float(time_limit_seconds))
|
|
47
|
+
or time_limit_seconds < 0
|
|
48
|
+
):
|
|
49
|
+
raise ValueError("time_limit_seconds must be finite and non-negative")
|
|
50
|
+
if not isinstance(symmetry_pruning, bool):
|
|
51
|
+
raise TypeError("symmetry_pruning must be boolean")
|
|
52
|
+
if not isinstance(expand_symmetry, bool):
|
|
53
|
+
raise TypeError("expand_symmetry must be boolean")
|
|
54
|
+
if expand_symmetry and not symmetry_pruning:
|
|
55
|
+
raise ValueError("expand_symmetry=True requires symmetry_pruning=True")
|
|
56
|
+
if expand_symmetry and certify:
|
|
57
|
+
raise ValueError("symmetry expansion is not supported by certificates")
|
|
58
|
+
if (
|
|
59
|
+
isinstance(max_symmetry_automorphisms, bool)
|
|
60
|
+
or not isinstance(max_symmetry_automorphisms, Integral)
|
|
61
|
+
or max_symmetry_automorphisms < 1
|
|
62
|
+
):
|
|
63
|
+
raise ValueError("max_symmetry_automorphisms must be a positive integer")
|
|
64
|
+
if (
|
|
65
|
+
isinstance(symmetry_timeout_seconds, bool)
|
|
66
|
+
or not isinstance(symmetry_timeout_seconds, Real)
|
|
67
|
+
or not math.isfinite(float(symmetry_timeout_seconds))
|
|
68
|
+
or symmetry_timeout_seconds < 0
|
|
69
|
+
):
|
|
70
|
+
raise ValueError("symmetry_timeout_seconds must be finite and non-negative")
|
|
71
|
+
if (
|
|
72
|
+
isinstance(symmetry_max_search_nodes, bool)
|
|
73
|
+
or not isinstance(symmetry_max_search_nodes, Integral)
|
|
74
|
+
or symmetry_max_search_nodes < 1
|
|
75
|
+
):
|
|
76
|
+
raise ValueError("symmetry_max_search_nodes must be a positive integer")
|
|
77
|
+
if max_mappings is not None and (
|
|
78
|
+
isinstance(max_mappings, bool)
|
|
79
|
+
or not isinstance(max_mappings, Integral)
|
|
80
|
+
or max_mappings < 1
|
|
81
|
+
):
|
|
82
|
+
raise ValueError("max_mappings must be a positive integer or None")
|
|
83
|
+
if not isinstance(assignment_lower_bound, bool):
|
|
84
|
+
raise TypeError("assignment_lower_bound must be boolean")
|
|
85
|
+
if not isinstance(assignment_upper_bound, bool):
|
|
86
|
+
raise TypeError("assignment_upper_bound must be boolean")
|
|
87
|
+
if not isinstance(atom_profile_pruning, bool):
|
|
88
|
+
raise TypeError("atom_profile_pruning must be boolean")
|
|
89
|
+
if not isinstance(seed_center_order, bool):
|
|
90
|
+
raise TypeError("seed_center_order must be boolean")
|
|
91
|
+
if isinstance(symmetry_node_properties, str):
|
|
92
|
+
raise TypeError("symmetry_node_properties must be a sequence of names")
|
|
93
|
+
if not isinstance(collect_mappings, bool):
|
|
94
|
+
raise TypeError("collect_mappings must be boolean")
|
|
95
|
+
if mapping_callback is not None and not callable(mapping_callback):
|
|
96
|
+
raise TypeError("mapping_callback must be callable or None")
|
|
97
|
+
if not isinstance(compute_minimum_cost, bool):
|
|
98
|
+
raise TypeError("compute_minimum_cost must be boolean")
|
|
99
|
+
if certify and not collect_mappings:
|
|
100
|
+
raise ValueError("certify=True currently requires collect_mappings=True")
|
|
101
|
+
if not isinstance(_optimization_only, bool):
|
|
102
|
+
raise TypeError("_optimization_only must be boolean")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def prepare_distance_problem(lgp, binary, fixed_mapping, certify, expand_symmetry):
|
|
106
|
+
"""Normalize graph matrices, fixed assignments, and input proof metadata."""
|
|
107
|
+
reactant, reactant_elements = _adjacency_and_elements(lgp[0], binary)
|
|
108
|
+
product, product_elements = _adjacency_and_elements(lgp[1], binary)
|
|
109
|
+
if reactant.shape != product.shape:
|
|
110
|
+
raise ValueError("reactant and product must have the same number of atoms")
|
|
111
|
+
|
|
112
|
+
reactant_counts: dict[object, int] = {}
|
|
113
|
+
product_by_element: dict[object, list[int]] = {}
|
|
114
|
+
for element in reactant_elements:
|
|
115
|
+
reactant_counts[element] = reactant_counts.get(element, 0) + 1
|
|
116
|
+
for index, element in enumerate(product_elements):
|
|
117
|
+
product_by_element.setdefault(element, []).append(index)
|
|
118
|
+
if reactant_counts != {
|
|
119
|
+
element: len(indices) for element, indices in product_by_element.items()
|
|
120
|
+
}:
|
|
121
|
+
raise ValueError("reactant and product atom-type multisets differ")
|
|
122
|
+
|
|
123
|
+
atom_count = len(reactant_elements)
|
|
124
|
+
fixed = normalize_fixed_mapping(
|
|
125
|
+
fixed_mapping,
|
|
126
|
+
atom_count,
|
|
127
|
+
reactant_elements,
|
|
128
|
+
product_elements,
|
|
129
|
+
certify,
|
|
130
|
+
expand_symmetry,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
fixed_images = set(fixed.values())
|
|
134
|
+
remaining_reactant_counts: dict[object, int] = {}
|
|
135
|
+
remaining_product_counts: dict[object, int] = {}
|
|
136
|
+
for atom, element in enumerate(reactant_elements):
|
|
137
|
+
if atom not in fixed:
|
|
138
|
+
remaining_reactant_counts[element] = (
|
|
139
|
+
remaining_reactant_counts.get(element, 0) + 1
|
|
140
|
+
)
|
|
141
|
+
for image, element in enumerate(product_elements):
|
|
142
|
+
if image not in fixed_images:
|
|
143
|
+
remaining_product_counts[element] = (
|
|
144
|
+
remaining_product_counts.get(element, 0) + 1
|
|
145
|
+
)
|
|
146
|
+
if remaining_reactant_counts != remaining_product_counts:
|
|
147
|
+
raise ValueError("fixed_mapping leaves incompatible atom-type multisets")
|
|
148
|
+
|
|
149
|
+
total_bijections = math.prod(
|
|
150
|
+
math.factorial(count) for count in remaining_reactant_counts.values()
|
|
151
|
+
)
|
|
152
|
+
maximum_cost_upper_bound = 0.5 * float(
|
|
153
|
+
np.abs(reactant).sum() + np.abs(product).sum()
|
|
154
|
+
)
|
|
155
|
+
input_sha256 = _input_sha256(
|
|
156
|
+
reactant,
|
|
157
|
+
product,
|
|
158
|
+
reactant_elements,
|
|
159
|
+
product_elements,
|
|
160
|
+
binary,
|
|
161
|
+
)
|
|
162
|
+
return (
|
|
163
|
+
reactant,
|
|
164
|
+
product,
|
|
165
|
+
reactant_elements,
|
|
166
|
+
product_elements,
|
|
167
|
+
reactant_counts,
|
|
168
|
+
product_by_element,
|
|
169
|
+
atom_count,
|
|
170
|
+
fixed,
|
|
171
|
+
fixed_images,
|
|
172
|
+
total_bijections,
|
|
173
|
+
maximum_cost_upper_bound,
|
|
174
|
+
input_sha256,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def normalize_initial_mapping(
|
|
179
|
+
initial_mapping, atom_count, reactant_elements, product_elements, fixed
|
|
180
|
+
):
|
|
181
|
+
"""Validate an optional complete atom-compatible incumbent permutation."""
|
|
182
|
+
preferred_mapping = None
|
|
183
|
+
if initial_mapping is not None:
|
|
184
|
+
preferred_mapping = [int(image) for image in initial_mapping]
|
|
185
|
+
if sorted(preferred_mapping) != list(range(atom_count)):
|
|
186
|
+
raise ValueError("initial_mapping must be a complete permutation")
|
|
187
|
+
if any(
|
|
188
|
+
reactant_elements[atom] != product_elements[image]
|
|
189
|
+
for atom, image in enumerate(preferred_mapping)
|
|
190
|
+
):
|
|
191
|
+
raise ValueError("initial_mapping must preserve atom types")
|
|
192
|
+
if any(preferred_mapping[atom] != image for atom, image in fixed.items()):
|
|
193
|
+
raise ValueError("initial_mapping must agree with fixed_mapping")
|
|
194
|
+
return preferred_mapping
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def initial_distance_domains(
|
|
198
|
+
reactant_order,
|
|
199
|
+
reactant_elements,
|
|
200
|
+
product_by_element,
|
|
201
|
+
fixed_images,
|
|
202
|
+
profile_edge_bounds,
|
|
203
|
+
profile_domain_limit,
|
|
204
|
+
tolerance,
|
|
205
|
+
):
|
|
206
|
+
"""Build the initial atom-compatible domains and count profile exclusions."""
|
|
207
|
+
domains = {}
|
|
208
|
+
profile_domain_pruned = 0
|
|
209
|
+
for atom in reactant_order:
|
|
210
|
+
images = [
|
|
211
|
+
image
|
|
212
|
+
for image in product_by_element[reactant_elements[atom]]
|
|
213
|
+
if image not in fixed_images
|
|
214
|
+
]
|
|
215
|
+
if profile_edge_bounds is not None and profile_domain_limit is not None:
|
|
216
|
+
before = len(images)
|
|
217
|
+
images = [
|
|
218
|
+
image
|
|
219
|
+
for image in images
|
|
220
|
+
if profile_edge_bounds[atom, image] <= profile_domain_limit + tolerance
|
|
221
|
+
]
|
|
222
|
+
profile_domain_pruned += before - len(images)
|
|
223
|
+
domains[atom] = tuple(images)
|
|
224
|
+
return domains, profile_domain_pruned
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def supports_strict_improvement(
|
|
228
|
+
_optimization_only, target, certify, maximum_cost_upper_bound, reactant, product
|
|
229
|
+
):
|
|
230
|
+
"""Allow tie rejection only in a proof pass with exact lattice costs."""
|
|
231
|
+
return bool(
|
|
232
|
+
_optimization_only
|
|
233
|
+
and target == "minimal"
|
|
234
|
+
and not certify
|
|
235
|
+
and maximum_cost_upper_bound < 2**40
|
|
236
|
+
and np.isfinite(reactant).all()
|
|
237
|
+
and np.isfinite(product).all()
|
|
238
|
+
and np.equal(reactant * 2, np.rint(reactant * 2)).all()
|
|
239
|
+
and np.equal(product * 2, np.rint(product * 2)).all()
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def normalize_fixed_mapping(
|
|
244
|
+
fixed_mapping,
|
|
245
|
+
atom_count,
|
|
246
|
+
reactant_elements,
|
|
247
|
+
product_elements,
|
|
248
|
+
certify,
|
|
249
|
+
expand_symmetry,
|
|
250
|
+
):
|
|
251
|
+
"""Validate an injective, compatible set of pinned atom assignments."""
|
|
252
|
+
if fixed_mapping is None:
|
|
253
|
+
fixed = {}
|
|
254
|
+
elif hasattr(fixed_mapping, "items"):
|
|
255
|
+
fixed = {}
|
|
256
|
+
for atom, image in fixed_mapping.items():
|
|
257
|
+
if (
|
|
258
|
+
isinstance(atom, bool)
|
|
259
|
+
or not isinstance(atom, Integral)
|
|
260
|
+
or isinstance(image, bool)
|
|
261
|
+
or not isinstance(image, Integral)
|
|
262
|
+
):
|
|
263
|
+
raise TypeError("fixed_mapping indices must be integers")
|
|
264
|
+
fixed[int(atom)] = int(image)
|
|
265
|
+
else:
|
|
266
|
+
raise TypeError("fixed_mapping must be a mapping or None")
|
|
267
|
+
if any(atom < 0 or atom >= atom_count for atom in fixed):
|
|
268
|
+
raise ValueError("fixed_mapping reactant index is out of range")
|
|
269
|
+
if any(image < 0 or image >= atom_count for image in fixed.values()):
|
|
270
|
+
raise ValueError("fixed_mapping product index is out of range")
|
|
271
|
+
if len(set(fixed.values())) != len(fixed):
|
|
272
|
+
raise ValueError("fixed_mapping product images must be unique")
|
|
273
|
+
if any(
|
|
274
|
+
reactant_elements[atom] != product_elements[image]
|
|
275
|
+
for atom, image in fixed.items()
|
|
276
|
+
):
|
|
277
|
+
raise ValueError("fixed_mapping must preserve atom types")
|
|
278
|
+
if fixed and certify:
|
|
279
|
+
raise ValueError("certificates do not yet support fixed_mapping")
|
|
280
|
+
if fixed and expand_symmetry:
|
|
281
|
+
raise ValueError("symmetry expansion does not yet support fixed_mapping")
|
|
282
|
+
|
|
283
|
+
return fixed
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"""Result and certificate records for exact chemical-distance enumeration."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
import math
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from numbers import Real
|
|
10
|
+
from typing import Literal
|
|
11
|
+
|
|
12
|
+
DistanceTarget = Literal["minimal"] | float
|
|
13
|
+
EnumerationStatus = Literal["complete", "no_solutions", "timeout", "unsupported"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ExactEnumerationLimitError(ValueError):
|
|
17
|
+
"""Raised when a complete enumeration would exceed its explicit cap."""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CertificateVerificationError(ValueError):
|
|
21
|
+
"""Raised when an exact-distance certificate fails independent replay."""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def normalize_distance_target(CD: str | Real) -> DistanceTarget:
|
|
25
|
+
"""Validate and normalize ``CD='minimal'`` or a non-negative number."""
|
|
26
|
+
if isinstance(CD, str):
|
|
27
|
+
if CD.lower() != "minimal":
|
|
28
|
+
raise ValueError("CD must be 'minimal' or a non-negative number")
|
|
29
|
+
return "minimal"
|
|
30
|
+
if isinstance(CD, bool) or not isinstance(CD, Real):
|
|
31
|
+
raise TypeError("CD must be 'minimal' or a non-negative number")
|
|
32
|
+
target = float(CD)
|
|
33
|
+
if not math.isfinite(target) or target < 0:
|
|
34
|
+
raise ValueError("CD must be finite and non-negative")
|
|
35
|
+
return target
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(frozen=True)
|
|
39
|
+
class DistanceEnumerationCertificate:
|
|
40
|
+
"""Replayable complete-cover certificate for one exact-CD query."""
|
|
41
|
+
|
|
42
|
+
schema_version: int
|
|
43
|
+
kind: str
|
|
44
|
+
input_sha256: str
|
|
45
|
+
target: DistanceTarget
|
|
46
|
+
binary: bool
|
|
47
|
+
tolerance: float
|
|
48
|
+
reactant_order: tuple[int, ...]
|
|
49
|
+
terminal_prefixes: tuple[tuple[int, ...], ...]
|
|
50
|
+
frontier_prefixes: tuple[tuple[int, ...], ...]
|
|
51
|
+
total_bijections: int
|
|
52
|
+
maximum_cost_upper_bound: float
|
|
53
|
+
selected_mapping_count: int
|
|
54
|
+
selected_mappings_sha256: str
|
|
55
|
+
cost: float | None
|
|
56
|
+
pruning_limit: float | None
|
|
57
|
+
status: EnumerationStatus
|
|
58
|
+
certificate_sha256: str
|
|
59
|
+
mapping_scope: str = "complete_atom_compatible_assignment_space"
|
|
60
|
+
symmetry_prefixes: tuple[tuple[tuple[int, ...], tuple[int, ...]], ...] = ()
|
|
61
|
+
lower_bound_prefixes: tuple[tuple[int, ...], ...] = ()
|
|
62
|
+
upper_bound_prefixes: tuple[tuple[int, ...], ...] = ()
|
|
63
|
+
|
|
64
|
+
def as_dict(self) -> dict[str, object]:
|
|
65
|
+
"""Return a JSON-compatible certificate record."""
|
|
66
|
+
record = {
|
|
67
|
+
"schema_version": self.schema_version,
|
|
68
|
+
"kind": self.kind,
|
|
69
|
+
"input_sha256": self.input_sha256,
|
|
70
|
+
"target": self.target,
|
|
71
|
+
"binary": self.binary,
|
|
72
|
+
"tolerance": self.tolerance,
|
|
73
|
+
"reactant_order": list(self.reactant_order),
|
|
74
|
+
"terminal_prefixes": [list(value) for value in self.terminal_prefixes],
|
|
75
|
+
"frontier_prefixes": [list(value) for value in self.frontier_prefixes],
|
|
76
|
+
"total_bijections": self.total_bijections,
|
|
77
|
+
"maximum_cost_upper_bound": self.maximum_cost_upper_bound,
|
|
78
|
+
"selected_mapping_count": self.selected_mapping_count,
|
|
79
|
+
"selected_mappings_sha256": self.selected_mappings_sha256,
|
|
80
|
+
"cost": self.cost,
|
|
81
|
+
"pruning_limit": self.pruning_limit,
|
|
82
|
+
"status": self.status,
|
|
83
|
+
"certificate_sha256": self.certificate_sha256,
|
|
84
|
+
}
|
|
85
|
+
if self.schema_version >= 2:
|
|
86
|
+
record["mapping_scope"] = self.mapping_scope
|
|
87
|
+
record["symmetry_prefixes"] = [
|
|
88
|
+
[list(prefix), list(witness)]
|
|
89
|
+
for prefix, witness in self.symmetry_prefixes
|
|
90
|
+
]
|
|
91
|
+
if self.schema_version >= 3:
|
|
92
|
+
record["lower_bound_prefixes"] = [
|
|
93
|
+
list(prefix) for prefix in self.lower_bound_prefixes
|
|
94
|
+
]
|
|
95
|
+
if self.schema_version >= 4:
|
|
96
|
+
record["upper_bound_prefixes"] = [
|
|
97
|
+
list(prefix) for prefix in self.upper_bound_prefixes
|
|
98
|
+
]
|
|
99
|
+
return record
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def from_dict(cls, record: dict[str, object]):
|
|
103
|
+
"""Restore a certificate from its JSON-compatible representation."""
|
|
104
|
+
return cls(
|
|
105
|
+
schema_version=int(record["schema_version"]),
|
|
106
|
+
kind=str(record["kind"]),
|
|
107
|
+
input_sha256=str(record["input_sha256"]),
|
|
108
|
+
target=record["target"],
|
|
109
|
+
binary=bool(record["binary"]),
|
|
110
|
+
tolerance=float(record["tolerance"]),
|
|
111
|
+
reactant_order=tuple(int(value) for value in record["reactant_order"]),
|
|
112
|
+
terminal_prefixes=tuple(
|
|
113
|
+
tuple(int(value) for value in prefix)
|
|
114
|
+
for prefix in record["terminal_prefixes"]
|
|
115
|
+
),
|
|
116
|
+
frontier_prefixes=tuple(
|
|
117
|
+
tuple(int(value) for value in prefix)
|
|
118
|
+
for prefix in record.get("frontier_prefixes", [])
|
|
119
|
+
),
|
|
120
|
+
total_bijections=int(record["total_bijections"]),
|
|
121
|
+
maximum_cost_upper_bound=float(record["maximum_cost_upper_bound"]),
|
|
122
|
+
selected_mapping_count=int(record["selected_mapping_count"]),
|
|
123
|
+
selected_mappings_sha256=str(record["selected_mappings_sha256"]),
|
|
124
|
+
cost=None if record["cost"] is None else float(record["cost"]),
|
|
125
|
+
pruning_limit=(
|
|
126
|
+
None
|
|
127
|
+
if record.get("pruning_limit") is None
|
|
128
|
+
else float(record["pruning_limit"])
|
|
129
|
+
),
|
|
130
|
+
status=record["status"],
|
|
131
|
+
certificate_sha256=str(record["certificate_sha256"]),
|
|
132
|
+
mapping_scope=str(
|
|
133
|
+
record.get(
|
|
134
|
+
"mapping_scope",
|
|
135
|
+
"complete_atom_compatible_assignment_space",
|
|
136
|
+
)
|
|
137
|
+
),
|
|
138
|
+
symmetry_prefixes=tuple(
|
|
139
|
+
(
|
|
140
|
+
tuple(int(value) for value in prefix),
|
|
141
|
+
tuple(int(value) for value in witness),
|
|
142
|
+
)
|
|
143
|
+
for prefix, witness in record.get("symmetry_prefixes", [])
|
|
144
|
+
),
|
|
145
|
+
lower_bound_prefixes=tuple(
|
|
146
|
+
tuple(int(value) for value in prefix)
|
|
147
|
+
for prefix in record.get("lower_bound_prefixes", [])
|
|
148
|
+
),
|
|
149
|
+
upper_bound_prefixes=tuple(
|
|
150
|
+
tuple(int(value) for value in prefix)
|
|
151
|
+
for prefix in record.get("upper_bound_prefixes", [])
|
|
152
|
+
),
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
@dataclass
|
|
157
|
+
class DistanceEnumerationResult:
|
|
158
|
+
"""Complete mappings and search metadata for one exact-CD query."""
|
|
159
|
+
|
|
160
|
+
target: DistanceTarget
|
|
161
|
+
cost: float | None
|
|
162
|
+
minimum_cost: float | None
|
|
163
|
+
mappings: list[list[int]]
|
|
164
|
+
distances: list[float]
|
|
165
|
+
total_bijections: int
|
|
166
|
+
maximum_cost_upper_bound: float
|
|
167
|
+
visited_leaves: int
|
|
168
|
+
pruned_branches: int
|
|
169
|
+
elapsed_seconds: float
|
|
170
|
+
status: EnumerationStatus
|
|
171
|
+
complete: bool
|
|
172
|
+
truncation_reason: str | None = None
|
|
173
|
+
scope: str = "complete_atom_compatible_assignment_space"
|
|
174
|
+
certificate: DistanceEnumerationCertificate | None = None
|
|
175
|
+
visited_nodes: int = 0
|
|
176
|
+
symmetry_pruned_branches: int = 0
|
|
177
|
+
symmetry_automorphism_count: int = 1
|
|
178
|
+
symmetry_search_complete: bool = True
|
|
179
|
+
lower_bound_pruned_branches: int = 0
|
|
180
|
+
upper_bound_pruned_branches: int = 0
|
|
181
|
+
selected_mapping_count: int = 0
|
|
182
|
+
symmetry_group_order: int | None = 1
|
|
183
|
+
symmetry_quotient_complete: bool = True
|
|
184
|
+
selected_labeled_mapping_count: int | None = 0
|
|
185
|
+
backend: str = "assignment_branch_and_bound"
|
|
186
|
+
backend_statistics: dict[str, object] | None = None
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _canonical_json(value: object) -> bytes:
|
|
190
|
+
return json.dumps(
|
|
191
|
+
value,
|
|
192
|
+
sort_keys=True,
|
|
193
|
+
separators=(",", ":"),
|
|
194
|
+
ensure_ascii=True,
|
|
195
|
+
allow_nan=False,
|
|
196
|
+
).encode("ascii")
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _typed_element(value: object) -> tuple[str, str]:
|
|
200
|
+
return (
|
|
201
|
+
f"{type(value).__module__}.{type(value).__qualname__}",
|
|
202
|
+
repr(value),
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _input_sha256(reactant, product, reactant_elements, product_elements, binary):
|
|
207
|
+
payload = {
|
|
208
|
+
"binary": bool(binary),
|
|
209
|
+
"reactant": reactant.tolist(),
|
|
210
|
+
"product": product.tolist(),
|
|
211
|
+
"reactant_elements": [_typed_element(value) for value in reactant_elements],
|
|
212
|
+
"product_elements": [_typed_element(value) for value in product_elements],
|
|
213
|
+
}
|
|
214
|
+
return hashlib.sha256(_canonical_json(payload)).hexdigest()
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _mappings_sha256(mappings) -> str:
|
|
218
|
+
normalized = sorted(tuple(int(image) for image in mapping) for mapping in mappings)
|
|
219
|
+
return hashlib.sha256(_canonical_json(normalized)).hexdigest()
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def _certificate_sha256(payload: dict[str, object]) -> str:
|
|
223
|
+
unsigned = dict(payload)
|
|
224
|
+
unsigned.pop("certificate_sha256", None)
|
|
225
|
+
return hashlib.sha256(_canonical_json(unsigned)).hexdigest()
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def _make_certificate(**kwargs) -> DistanceEnumerationCertificate:
|
|
229
|
+
unsigned = DistanceEnumerationCertificate(certificate_sha256="", **kwargs)
|
|
230
|
+
digest = _certificate_sha256(unsigned.as_dict())
|
|
231
|
+
return DistanceEnumerationCertificate(certificate_sha256=digest, **kwargs)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
__all__ = [
|
|
235
|
+
"CertificateVerificationError",
|
|
236
|
+
"DistanceEnumerationCertificate",
|
|
237
|
+
"DistanceEnumerationResult",
|
|
238
|
+
"DistanceTarget",
|
|
239
|
+
"EnumerationStatus",
|
|
240
|
+
"ExactEnumerationLimitError",
|
|
241
|
+
"normalize_distance_target",
|
|
242
|
+
]
|