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,140 @@
|
|
|
1
|
+
#ifndef SYNKIT_MAPPER_SYMMETRY_CLASSIFICATION_H
|
|
2
|
+
#define SYNKIT_MAPPER_SYMMETRY_CLASSIFICATION_H
|
|
3
|
+
|
|
4
|
+
#include <stdint.h>
|
|
5
|
+
#include "synkit_mapper/slap.h"
|
|
6
|
+
#include "synkit_mapper/mapper.h"
|
|
7
|
+
|
|
8
|
+
#ifdef __cplusplus
|
|
9
|
+
extern "C" {
|
|
10
|
+
#endif
|
|
11
|
+
|
|
12
|
+
/* Exact palette ranks are ordered by Python's _encode_color tokens. Node
|
|
13
|
+
* colors are ranks, edge colors rank+1 (zero is absent). Endpoint edge states
|
|
14
|
+
* are independent dense indices; edge_pair_colors pairs their full attributes,
|
|
15
|
+
* including optional E/Z. Thus no chemistry attribute is discarded natively.
|
|
16
|
+
* Palette entries are canonical ASCII JSON tokens, without surrounding list.
|
|
17
|
+
* Only complete canonical searches publish keys. Equality uses full SKC1 bytes,
|
|
18
|
+
* never their SHA256 identifiers. The identifiers preserve the legacy dense
|
|
19
|
+
* certificate SHA256 encoding. This additive interface has version 1.
|
|
20
|
+
*/
|
|
21
|
+
typedef struct SynkitClassProblem {
|
|
22
|
+
int32_t n;
|
|
23
|
+
const int32_t *node_pair_colors; /* n*n */
|
|
24
|
+
const int32_t *edges_r; /* n*n endpoint state IDs */
|
|
25
|
+
const int32_t *edges_p;
|
|
26
|
+
int32_t edge_states_r;
|
|
27
|
+
int32_t edge_states_p;
|
|
28
|
+
const int32_t *edge_pair_colors;
|
|
29
|
+
int32_t palette_size;
|
|
30
|
+
const char *const *palette_json;
|
|
31
|
+
} SynkitClassProblem;
|
|
32
|
+
|
|
33
|
+
typedef struct SynkitClassStatistics {
|
|
34
|
+
int64_t candidates;
|
|
35
|
+
int64_t classes;
|
|
36
|
+
int64_t canonical_nodes;
|
|
37
|
+
int32_t complete;
|
|
38
|
+
/* 0 complete, 1 deadline, 2 canonical node cap, 3 class cap, 4 callback,
|
|
39
|
+
* 5 cancellation requested. */
|
|
40
|
+
int32_t reason;
|
|
41
|
+
double elapsed_seconds;
|
|
42
|
+
} SynkitClassStatistics;
|
|
43
|
+
|
|
44
|
+
typedef int (*SynkitClassCallback)(const int32_t *representative,
|
|
45
|
+
int64_t cost2, int64_t observed_count,
|
|
46
|
+
const unsigned char *packed_key,
|
|
47
|
+
int64_t packed_size,
|
|
48
|
+
const char *legacy_identifier,
|
|
49
|
+
void *userdata);
|
|
50
|
+
|
|
51
|
+
SYNKIT_MAPPER_API int synkit_mapper_classification_abi(void);
|
|
52
|
+
/* Additive capacity discovery; libraries without this export support256. */
|
|
53
|
+
SYNKIT_MAPPER_API int synkit_mapper_classification_max_vertices(void);
|
|
54
|
+
SYNKIT_MAPPER_API const char *synkit_mapper_classification_error(void);
|
|
55
|
+
/* mappings is count*n, costs2 is count. seconds=-1 means unlimited. A shared
|
|
56
|
+
* remaining deadline should be passed by the pipeline. All caps are -1 or
|
|
57
|
+
* positive; max_nodes applies across the entire batch. No exceptions cross
|
|
58
|
+
* callbacks. Return 0 for complete/interrupted, -1 for invalid input/error. */
|
|
59
|
+
SYNKIT_MAPPER_API int synkit_mapper_classify_batch(
|
|
60
|
+
const SynkitClassProblem *problem, int64_t count,
|
|
61
|
+
const int32_t *mappings, const int64_t *costs2,
|
|
62
|
+
double seconds, int64_t max_nodes, int64_t max_classes,
|
|
63
|
+
SynkitClassCallback callback, void *userdata,
|
|
64
|
+
SynkitClassStatistics *statistics);
|
|
65
|
+
SYNKIT_MAPPER_API int synkit_mapper_classify_batch_with_cancel(
|
|
66
|
+
const SynkitClassProblem *problem, int64_t count,
|
|
67
|
+
const int32_t *mappings, const int64_t *costs2,
|
|
68
|
+
double seconds, int64_t max_nodes, int64_t max_classes, void *cancel_token,
|
|
69
|
+
SynkitClassCallback callback, void *userdata,
|
|
70
|
+
SynkitClassStatistics *statistics);
|
|
71
|
+
|
|
72
|
+
/* Additive delivery mode: first discovery publishes a complete exact key
|
|
73
|
+
* immediately, then a final cumulative observed-count update when needed.
|
|
74
|
+
* Merge callbacks by the FULL packed key; updates are not new mappings or
|
|
75
|
+
* additional classes. Complete output has final counts. Interrupted output
|
|
76
|
+
* counts are nondecreasing lower bounds and incomplete flags stay explicit.
|
|
77
|
+
* The legacy batch entry points and their one-callback contract are unchanged.
|
|
78
|
+
* Publication and canonical work share the supplied deadline. */
|
|
79
|
+
SYNKIT_MAPPER_API int synkit_mapper_classify_batch_updates_with_cancel(
|
|
80
|
+
const SynkitClassProblem *problem, int64_t count,
|
|
81
|
+
const int32_t *mappings, const int64_t *costs2,
|
|
82
|
+
double seconds, int64_t max_nodes, int64_t max_classes, void *cancel_token,
|
|
83
|
+
SynkitClassCallback callback, void *userdata,
|
|
84
|
+
SynkitClassStatistics *statistics);
|
|
85
|
+
|
|
86
|
+
/* Additive explicit options; both flags must be 0 or 1. updates uses the
|
|
87
|
+
* cumulative-count contract above. packed_identifier=1 returns SHA256 of the
|
|
88
|
+
* exact SKC1 bytes as the presentation identifier; 0 preserves legacy IDs.
|
|
89
|
+
* Keys, canonicalization, deduplication, budgets and statistics are unchanged.
|
|
90
|
+
* No process-global mode is set; existing entry points always use legacy IDs. */
|
|
91
|
+
SYNKIT_MAPPER_API int synkit_mapper_classify_batch_ex(
|
|
92
|
+
const SynkitClassProblem *problem, int64_t count,
|
|
93
|
+
const int32_t *mappings, const int64_t *costs2,
|
|
94
|
+
double seconds, int64_t max_nodes, int64_t max_classes, void *cancel_token,
|
|
95
|
+
SynkitClassCallback callback, void *userdata,
|
|
96
|
+
SynkitClassStatistics *statistics, int32_t updates, int32_t packed_identifier);
|
|
97
|
+
|
|
98
|
+
/* Entire prepared search -> class pipeline. Intermediate mapping callbacks
|
|
99
|
+
* stay in C++; only class records cross the output callback. Search and class
|
|
100
|
+
* processing share the request deadline and core cancellation token. The
|
|
101
|
+
* supplied request must have classify=1; class cap applies to distinct keys.
|
|
102
|
+
* Classification node budget is separate and explicit. Search candidate cap
|
|
103
|
+
* retains its candidate units; exact class equality is never a hash test.
|
|
104
|
+
* Results distinguish search completion from classification completion. */
|
|
105
|
+
SYNKIT_MAPPER_API int synkit_mapper_solve_classified(
|
|
106
|
+
const SynkitMapperProblem *, const SynkitMapperRequest *,
|
|
107
|
+
const SynkitClassProblem *, int64_t max_canonical_nodes,
|
|
108
|
+
SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *);
|
|
109
|
+
/* Restricted-domain variant. The row-major n*n zero/one mask is passed intact
|
|
110
|
+
* to synkit_mapper_solve_domains; neither classification nor batching expands
|
|
111
|
+
* it. Minimum proof/completeness scope remains exactly the supplied domains. */
|
|
112
|
+
SYNKIT_MAPPER_API int synkit_mapper_solve_domains_classified(
|
|
113
|
+
const SynkitMapperProblem *, const SynkitMapperRequest *, const uint8_t *allowed,
|
|
114
|
+
const SynkitClassProblem *, int64_t max_canonical_nodes,
|
|
115
|
+
SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *);
|
|
116
|
+
|
|
117
|
+
/* Search followed by incremental class delivery, with cumulative-count
|
|
118
|
+
* callbacks as documented above. Existing classified entry points remain
|
|
119
|
+
* batch interfaces. Raw search and classification still share one deadline. */
|
|
120
|
+
SYNKIT_MAPPER_API int synkit_mapper_solve_classified_updates(
|
|
121
|
+
const SynkitMapperProblem *, const SynkitMapperRequest *,
|
|
122
|
+
const SynkitClassProblem *, int64_t max_canonical_nodes,
|
|
123
|
+
SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *);
|
|
124
|
+
SYNKIT_MAPPER_API int synkit_mapper_solve_domains_classified_updates(
|
|
125
|
+
const SynkitMapperProblem *, const SynkitMapperRequest *, const uint8_t *allowed,
|
|
126
|
+
const SynkitClassProblem *, int64_t max_canonical_nodes,
|
|
127
|
+
SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *);
|
|
128
|
+
|
|
129
|
+
/* Explicit options as above; allowed may be NULL for unrestricted search or
|
|
130
|
+
* the unchanged n*n zero/one kernel mask. ABI1 structs are not extended. */
|
|
131
|
+
SYNKIT_MAPPER_API int synkit_mapper_solve_classified_ex(
|
|
132
|
+
const SynkitMapperProblem *, const SynkitMapperRequest *, const uint8_t *allowed,
|
|
133
|
+
const SynkitClassProblem *, int64_t max_canonical_nodes,
|
|
134
|
+
SynkitClassCallback, void *, SynkitMapperStatistics *, SynkitClassStatistics *,
|
|
135
|
+
int32_t updates, int32_t packed_identifier);
|
|
136
|
+
|
|
137
|
+
#ifdef __cplusplus
|
|
138
|
+
}
|
|
139
|
+
#endif
|
|
140
|
+
#endif
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#ifndef SYNKIT_MAPPER_SYMMETRY_CPABS_H
|
|
2
|
+
#define SYNKIT_MAPPER_SYMMETRY_CPABS_H
|
|
3
|
+
#include "synkit_mapper/mapper.h"
|
|
4
|
+
#ifdef __cplusplus
|
|
5
|
+
extern "C" {
|
|
6
|
+
#endif
|
|
7
|
+
typedef struct SynkitCPABSProfile {
|
|
8
|
+
int64_t discovery_nodes;
|
|
9
|
+
int64_t subgroup_order;
|
|
10
|
+
int64_t canonical_calls;
|
|
11
|
+
int64_t augmentations;
|
|
12
|
+
int64_t canonical_rejections;
|
|
13
|
+
int64_t bound_rejections;
|
|
14
|
+
int32_t identity_fallback_r;
|
|
15
|
+
int32_t identity_fallback_p;
|
|
16
|
+
double discovery_seconds;
|
|
17
|
+
double canonical_seconds;
|
|
18
|
+
} SynkitCPABSProfile;
|
|
19
|
+
/* Read the current thread's most recent run. Profile is diagnostic, never a
|
|
20
|
+
* claim of complete endpoint symmetry discovery. Legacy fallback flags now
|
|
21
|
+
* indicate an incomplete quotient group; verified twin factors remain active. */
|
|
22
|
+
SYNKIT_MAPPER_API void synkit_mapper_cpabs_profile(SynkitCPABSProfile *);
|
|
23
|
+
typedef struct SynkitCPABSProfileV2 {
|
|
24
|
+
SynkitCPABSProfile base;
|
|
25
|
+
int64_t twin_blocks_r,twin_blocks_p,quotient_order_r,quotient_order_p;
|
|
26
|
+
int64_t bound_calls,seed_cost2;
|
|
27
|
+
double bound_seconds,seed_seconds;
|
|
28
|
+
} SynkitCPABSProfileV2;
|
|
29
|
+
SYNKIT_MAPPER_API void synkit_mapper_cpabs_profile_v2(SynkitCPABSProfileV2 *);
|
|
30
|
+
#ifdef __cplusplus
|
|
31
|
+
}
|
|
32
|
+
#endif
|
|
33
|
+
#endif
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
#include "synkit_mapper/core/runtime.h"
|
|
2
|
+
#include <limits>
|
|
3
|
+
#include <numeric>
|
|
4
|
+
#include <set>
|
|
5
|
+
#include <string>
|
|
6
|
+
|
|
7
|
+
namespace synkit_mapper {
|
|
8
|
+
namespace {
|
|
9
|
+
constexpr int64_t INF = std::numeric_limits<int64_t>::max() / 8;
|
|
10
|
+
|
|
11
|
+
// Integral Hungarian assignment. Forbidden domain entries have cost INF.
|
|
12
|
+
int64_t lap(const std::vector<std::vector<int64_t>> &cost,
|
|
13
|
+
const Budget &budget, std::vector<int> *assignment = nullptr) {
|
|
14
|
+
const int n = static_cast<int>(cost.size());
|
|
15
|
+
std::vector<int64_t> u(n + 1), v(n + 1);
|
|
16
|
+
std::vector<int> p(n + 1), way(n + 1);
|
|
17
|
+
for (int i = 1; i <= n; ++i) {
|
|
18
|
+
budget.check();
|
|
19
|
+
p[0] = i;
|
|
20
|
+
int j0 = 0;
|
|
21
|
+
std::vector<int64_t> slack(n + 1, INF);
|
|
22
|
+
std::vector<bool> used(n + 1, false);
|
|
23
|
+
do {
|
|
24
|
+
budget.check();
|
|
25
|
+
used[j0] = true;
|
|
26
|
+
int i0 = p[j0], j1 = 0;
|
|
27
|
+
int64_t delta = INF;
|
|
28
|
+
for (int j = 1; j <= n; ++j)
|
|
29
|
+
if (!used[j]) {
|
|
30
|
+
int64_t cur = cost[i0 - 1][j - 1] >= INF
|
|
31
|
+
? INF
|
|
32
|
+
: cost[i0 - 1][j - 1] - u[i0] - v[j];
|
|
33
|
+
if (cur < slack[j]) {
|
|
34
|
+
slack[j] = cur;
|
|
35
|
+
way[j] = j0;
|
|
36
|
+
}
|
|
37
|
+
if (slack[j] < delta) {
|
|
38
|
+
delta = slack[j];
|
|
39
|
+
j1 = j;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (delta >= INF)
|
|
43
|
+
return INF;
|
|
44
|
+
for (int j = 0; j <= n; ++j)
|
|
45
|
+
if (used[j]) {
|
|
46
|
+
u[p[j]] += delta;
|
|
47
|
+
v[j] -= delta;
|
|
48
|
+
} else if (slack[j] < INF)
|
|
49
|
+
slack[j] -= delta;
|
|
50
|
+
j0 = j1;
|
|
51
|
+
} while (p[j0] != 0);
|
|
52
|
+
do {
|
|
53
|
+
int j1 = way[j0];
|
|
54
|
+
p[j0] = p[j1];
|
|
55
|
+
j0 = j1;
|
|
56
|
+
} while (j0);
|
|
57
|
+
}
|
|
58
|
+
if (assignment) {
|
|
59
|
+
assignment->assign(n, -1);
|
|
60
|
+
for (int j = 1; j <= n; ++j)
|
|
61
|
+
(*assignment)[p[j] - 1] = j - 1;
|
|
62
|
+
}
|
|
63
|
+
return -v[0];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
class AssignmentSearch {
|
|
67
|
+
const Problem &p;
|
|
68
|
+
const Request &r;
|
|
69
|
+
const uint8_t *allowed;
|
|
70
|
+
Callback callback;
|
|
71
|
+
void *userdata;
|
|
72
|
+
Statistics &s;
|
|
73
|
+
Budget budget;
|
|
74
|
+
std::vector<int> order;
|
|
75
|
+
std::vector<int32_t> mapping;
|
|
76
|
+
std::vector<bool> used;
|
|
77
|
+
int64_t best = INF;
|
|
78
|
+
int64_t threshold = 0;
|
|
79
|
+
bool optimize = false;
|
|
80
|
+
|
|
81
|
+
bool compatible(int i, int j) const {
|
|
82
|
+
return p.types_r[i] == p.types_p[j] &&
|
|
83
|
+
(!allowed || allowed[i * p.n + j]);
|
|
84
|
+
}
|
|
85
|
+
void poll() {
|
|
86
|
+
budget.check();
|
|
87
|
+
if (r.max_states >= 0 && s.nodes >= r.max_states)
|
|
88
|
+
throw Stop{SYNKIT_STOP_STATES};
|
|
89
|
+
++s.nodes;
|
|
90
|
+
}
|
|
91
|
+
int64_t cross(int i, int j, int depth) const {
|
|
92
|
+
int64_t value = 0;
|
|
93
|
+
for (int k = 0; k < depth; ++k) {
|
|
94
|
+
const int a = order[k];
|
|
95
|
+
value += std::abs(p.a2[i * p.n + a] - p.b2[j * p.n + mapping[a]]);
|
|
96
|
+
}
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
// Every unresolved-to-committed pair is counted exactly once. Ignoring
|
|
100
|
+
// unresolved-to-unresolved pairs can only decrease the nonnegative cost.
|
|
101
|
+
int64_t bound(int depth, int64_t committed) {
|
|
102
|
+
int count = p.n - depth;
|
|
103
|
+
std::vector<int> products;
|
|
104
|
+
for (int j = 0; j < p.n; ++j)
|
|
105
|
+
if (!used[j])
|
|
106
|
+
products.push_back(j);
|
|
107
|
+
std::vector<std::vector<int64_t>> costs(
|
|
108
|
+
count, std::vector<int64_t>(count, INF));
|
|
109
|
+
for (int a = 0; a < count; ++a) {
|
|
110
|
+
budget.check();
|
|
111
|
+
const int i = order[depth + a];
|
|
112
|
+
for (int b = 0; b < count; ++b)
|
|
113
|
+
if (compatible(i, products[b]))
|
|
114
|
+
costs[a][b] = cross(i, products[b], depth);
|
|
115
|
+
}
|
|
116
|
+
int64_t rest = lap(costs, budget);
|
|
117
|
+
return rest >= INF ? INF : committed + rest;
|
|
118
|
+
}
|
|
119
|
+
void emit(int64_t cost) {
|
|
120
|
+
++s.candidate_count;
|
|
121
|
+
s.labeled_count = s.candidate_count;
|
|
122
|
+
const auto start = Clock::now();
|
|
123
|
+
const int stop = callback ? callback(mapping.data(), cost, userdata) : 0;
|
|
124
|
+
s.callback_seconds += elapsed(start);
|
|
125
|
+
if (stop)
|
|
126
|
+
throw Stop{SYNKIT_STOP_CALLBACK};
|
|
127
|
+
budget.check();
|
|
128
|
+
if (r.max_candidates >= 0 && s.candidate_count >= r.max_candidates)
|
|
129
|
+
throw Stop{SYNKIT_STOP_CANDIDATES};
|
|
130
|
+
}
|
|
131
|
+
void visit(int depth, int64_t committed) {
|
|
132
|
+
poll();
|
|
133
|
+
const int64_t cutoff = optimize ? best : threshold;
|
|
134
|
+
if ((optimize && committed >= cutoff) || (!optimize && committed > cutoff))
|
|
135
|
+
return;
|
|
136
|
+
if (depth == p.n) {
|
|
137
|
+
++s.leaves;
|
|
138
|
+
if (optimize) {
|
|
139
|
+
best = committed;
|
|
140
|
+
s.incumbent2 = best;
|
|
141
|
+
} else if (r.query != SYNKIT_EXACT_DISTANCE || committed == threshold)
|
|
142
|
+
emit(committed);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
int64_t lower = bound(depth, committed);
|
|
146
|
+
if ((optimize && lower >= cutoff) || (!optimize && lower > cutoff))
|
|
147
|
+
return;
|
|
148
|
+
const int i = order[depth];
|
|
149
|
+
std::vector<std::pair<int64_t, int>> choices;
|
|
150
|
+
for (int j = 0; j < p.n; ++j)
|
|
151
|
+
if (!used[j] && compatible(i, j))
|
|
152
|
+
choices.emplace_back(cross(i, j, depth), j);
|
|
153
|
+
std::sort(choices.begin(), choices.end());
|
|
154
|
+
for (auto [delta, j] : choices) {
|
|
155
|
+
mapping[i] = j;
|
|
156
|
+
used[j] = true;
|
|
157
|
+
visit(depth + 1, committed + delta);
|
|
158
|
+
used[j] = false;
|
|
159
|
+
mapping[i] = -1;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public:
|
|
164
|
+
AssignmentSearch(const Problem &problem, const Request &request,
|
|
165
|
+
const uint8_t *domains, Callback cb, void *data,
|
|
166
|
+
Statistics &statistics)
|
|
167
|
+
: p(problem), r(request), allowed(domains), callback(cb), userdata(data),
|
|
168
|
+
s(statistics), budget(r), order(p.n), mapping(p.n, -1),
|
|
169
|
+
used(p.n, false) {}
|
|
170
|
+
int run() {
|
|
171
|
+
if (r.classify || r.max_classes != -1 || r.max_frontier != -1 ||
|
|
172
|
+
r.memory_limit_bytes != -1 || r.symmetry)
|
|
173
|
+
return unsupported(s);
|
|
174
|
+
double phase = 0;
|
|
175
|
+
try {
|
|
176
|
+
budget.check();
|
|
177
|
+
std::iota(order.begin(), order.end(), 0);
|
|
178
|
+
std::vector<int> sizes(p.n), degrees(p.n);
|
|
179
|
+
for (int i = 0; i < p.n; ++i)
|
|
180
|
+
for (int j = 0; j < p.n; ++j) {
|
|
181
|
+
sizes[i] += compatible(i, j);
|
|
182
|
+
degrees[i] += p.a2[i * p.n + j] != 0;
|
|
183
|
+
}
|
|
184
|
+
std::stable_sort(order.begin(), order.end(), [&](int a, int b) {
|
|
185
|
+
return sizes[a] == sizes[b] ? degrees[a] > degrees[b]
|
|
186
|
+
: sizes[a] < sizes[b];
|
|
187
|
+
});
|
|
188
|
+
std::vector<std::vector<int64_t>> seed_cost(
|
|
189
|
+
p.n, std::vector<int64_t>(p.n, INF));
|
|
190
|
+
for (int i = 0; i < p.n; ++i) {
|
|
191
|
+
budget.check();
|
|
192
|
+
for (int j = 0; j < p.n; ++j)
|
|
193
|
+
if (compatible(i, j))
|
|
194
|
+
seed_cost[i][j] = 0;
|
|
195
|
+
}
|
|
196
|
+
std::vector<int> seed;
|
|
197
|
+
if (lap(seed_cost, budget, &seed) < INF) {
|
|
198
|
+
std::vector<int32_t> candidate(seed.begin(), seed.end());
|
|
199
|
+
best = mapping_cost2(p, candidate);
|
|
200
|
+
s.incumbent2 = best;
|
|
201
|
+
}
|
|
202
|
+
s.model_seconds = budget.seconds();
|
|
203
|
+
phase = budget.seconds();
|
|
204
|
+
if (r.query == SYNKIT_MINIMUM_CLASSES || r.query == SYNKIT_MINIMUM_PROOF) {
|
|
205
|
+
optimize = true;
|
|
206
|
+
if (best > 0 && best < INF)
|
|
207
|
+
visit(0, 0);
|
|
208
|
+
budget.check();
|
|
209
|
+
s.optimization_seconds = budget.seconds() - phase;
|
|
210
|
+
if (best < INF) {
|
|
211
|
+
s.minimum_proven = 1;
|
|
212
|
+
s.minimum2 = s.lower_bound2 = best;
|
|
213
|
+
}
|
|
214
|
+
if (r.query == SYNKIT_MINIMUM_PROOF || best == INF) {
|
|
215
|
+
s.search_complete = 1;
|
|
216
|
+
s.elapsed_seconds = budget.seconds();
|
|
217
|
+
return 0;
|
|
218
|
+
}
|
|
219
|
+
threshold = best;
|
|
220
|
+
} else
|
|
221
|
+
threshold = r.target2;
|
|
222
|
+
optimize = false;
|
|
223
|
+
phase = budget.seconds();
|
|
224
|
+
visit(0, 0);
|
|
225
|
+
budget.check();
|
|
226
|
+
s.enumeration_seconds = budget.seconds() - phase;
|
|
227
|
+
s.search_complete = 1;
|
|
228
|
+
if (s.labeled_count < 0)
|
|
229
|
+
s.labeled_count = 0;
|
|
230
|
+
} catch (const Stop &stop) {
|
|
231
|
+
if (optimize)
|
|
232
|
+
s.optimization_seconds = budget.seconds() - phase;
|
|
233
|
+
else
|
|
234
|
+
s.enumeration_seconds = budget.seconds() - phase;
|
|
235
|
+
stopped(s, stop.reason);
|
|
236
|
+
}
|
|
237
|
+
s.elapsed_seconds = budget.seconds();
|
|
238
|
+
return 0;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
} // namespace
|
|
242
|
+
|
|
243
|
+
int solve_abb(const Problem &p, const Request &r, const uint8_t *domains,
|
|
244
|
+
Callback cb, void *data, Statistics &s) {
|
|
245
|
+
return AssignmentSearch(p, r, domains, cb, data, s).run();
|
|
246
|
+
}
|
|
247
|
+
} // namespace synkit_mapper
|
|
248
|
+
|
|
249
|
+
namespace {
|
|
250
|
+
thread_local std::string assignment_error;
|
|
251
|
+
}
|
|
252
|
+
extern "C" const char *synkit_mapper_assignment_error(void) {
|
|
253
|
+
return assignment_error.c_str();
|
|
254
|
+
}
|
|
255
|
+
extern "C" int synkit_mapper_kernel_domains(
|
|
256
|
+
int32_t n, int64_t count, const int32_t *mappings,
|
|
257
|
+
const int32_t *types_r, const int32_t *types_p, int32_t close_block_size,
|
|
258
|
+
uint8_t *allowed) {
|
|
259
|
+
assignment_error.clear();
|
|
260
|
+
try {
|
|
261
|
+
if (n < 1 || n > 1024 || count < 1 || count > 1000000 || !mappings ||
|
|
262
|
+
!types_r || !types_p || !allowed || close_block_size < 0)
|
|
263
|
+
throw std::invalid_argument("Invalid native uncertainty-kernel arguments");
|
|
264
|
+
std::fill(allowed, allowed + n * n, uint8_t{0});
|
|
265
|
+
for (int64_t k = 0; k < count; ++k) {
|
|
266
|
+
std::vector<bool> seen(n, false);
|
|
267
|
+
for (int i = 0; i < n; ++i) {
|
|
268
|
+
const int j = mappings[k * n + i];
|
|
269
|
+
if (j < 0 || j >= n || seen[j] || types_r[i] != types_p[j])
|
|
270
|
+
throw std::invalid_argument("Kernel candidate is not a compatible bijection");
|
|
271
|
+
seen[j] = true;
|
|
272
|
+
allowed[i * n + j] = 1;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
std::map<int32_t, std::vector<int>> rows;
|
|
276
|
+
for (int i = 0; i < n; ++i) {
|
|
277
|
+
int size = 0;
|
|
278
|
+
for (int j = 0; j < n; ++j)
|
|
279
|
+
size += allowed[i * n + j];
|
|
280
|
+
if (size > 1)
|
|
281
|
+
rows[types_r[i]].push_back(i);
|
|
282
|
+
}
|
|
283
|
+
for (const auto &[type, block] : rows) {
|
|
284
|
+
(void)type;
|
|
285
|
+
if (static_cast<int>(block.size()) > close_block_size)
|
|
286
|
+
continue;
|
|
287
|
+
std::set<int> products;
|
|
288
|
+
for (int i : block)
|
|
289
|
+
for (int j = 0; j < n; ++j)
|
|
290
|
+
if (allowed[i * n + j])
|
|
291
|
+
products.insert(j);
|
|
292
|
+
if (products.size() == block.size())
|
|
293
|
+
for (int i : block)
|
|
294
|
+
for (int j : products)
|
|
295
|
+
allowed[i * n + j] = 1;
|
|
296
|
+
}
|
|
297
|
+
return 0;
|
|
298
|
+
} catch (const std::exception &e) {
|
|
299
|
+
assignment_error = e.what();
|
|
300
|
+
return -1;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.16)
|
|
2
|
+
project(synkit_astar_standalone LANGUAGES CXX)
|
|
3
|
+
|
|
4
|
+
add_executable(astar_graph astar_graph.cpp astar.cpp bound.cpp)
|
|
5
|
+
target_compile_features(astar_graph PRIVATE cxx_std_17)
|
|
6
|
+
target_include_directories(astar_graph PRIVATE ../../include)
|
|
7
|
+
set_target_properties(astar_graph PROPERTIES CXX_EXTENSIONS OFF)
|
|
8
|
+
if(MSVC)
|
|
9
|
+
target_compile_options(astar_graph PRIVATE /W4)
|
|
10
|
+
else()
|
|
11
|
+
target_compile_options(astar_graph PRIVATE -Wall -Wextra -Wpedantic)
|
|
12
|
+
endif()
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Weighted best-first atom assignment
|
|
2
|
+
|
|
3
|
+
The module searches compatible bijections with a priority queue ordered by an
|
|
4
|
+
admissible bound in integer doubled-CD units. “Weighted” describes the Lewis
|
|
5
|
+
edge costs. The heuristic multiplier is exactly one; this is not the
|
|
6
|
+
suboptimal, inflated-heuristic variant sometimes called weighted A*.
|
|
7
|
+
|
|
8
|
+
For a partial map `p:S -> T`, let `U,V` be its residual vertices. Its committed
|
|
9
|
+
cost `g` contains exactly the pairs wholly in `S`. For a compatible `i -> j`,
|
|
10
|
+
let `c(i,j)` sum the discrepancies from `i,j` to all committed pairs. For each
|
|
11
|
+
hard atom type, sort the residual incident edge weights at `i` and `j`,
|
|
12
|
+
including zero weights and excluding the vertex itself. Let `q(i,j)` be the
|
|
13
|
+
sum of absolute differences between these sorted lists over all types.
|
|
14
|
+
|
|
15
|
+
Any compatible completion pairs those lists by a permutation. Sorted pairing
|
|
16
|
+
minimizes one-dimensional absolute discrepancy, so `q(i,j)` is no larger
|
|
17
|
+
than that completion's residual incident discrepancy. Summing over a complete
|
|
18
|
+
residual assignment counts every residual-residual edge twice. Consequently
|
|
19
|
+
|
|
20
|
+
h = ceil(min_compatible_assignment sum(2*c(i,j) + q(i,j)) / 2)
|
|
21
|
+
|
|
22
|
+
is no greater than the integral residual cost. The bound `g+h` has no double
|
|
23
|
+
counting: committed pairs are in `g`, committed/residual pairs are in `c`,
|
|
24
|
+
and residual pairs are covered by the half incident bound. Nonbonding-electron
|
|
25
|
+
anchors, if present in the common encoding, are ordinary forced typed vertices;
|
|
26
|
+
the module adds no second unary electron term.
|
|
27
|
+
|
|
28
|
+
Each state stores the entire partial image vector. A deterministic fixed
|
|
29
|
+
source order gives every labeled bijection one path; there is no symmetry
|
|
30
|
+
pruning and no closed set keyed by a used-target set or hash. In particular,
|
|
31
|
+
this implementation enumerates labeled mappings and requires the shared
|
|
32
|
+
classification stage for all-class output.
|
|
33
|
+
|
|
34
|
+
The first complete state removed from the queue proves the minimum, because
|
|
35
|
+
every unexpanded completion is bounded below by a queued state's bound.
|
|
36
|
+
Continuing until the least queue bound exceeds that optimum enumerates every
|
|
37
|
+
minimum labeled mapping. Numeric exact and at-most queries retain their
|
|
38
|
+
original threshold even after finding a cheaper mapping. Exact queries filter
|
|
39
|
+
only full-state costs; their threshold is never an incumbent.
|
|
40
|
+
|
|
41
|
+
An empty exhausted frontier proves the selected shell/interval complete (and
|
|
42
|
+
can prove no compatible completion). Time, cancellation, candidate, state and
|
|
43
|
+
frontier-memory stops preserve incomplete enumeration; a minimum already
|
|
44
|
+
proved remains a separate fact. Frontier bytes describe allocated state and
|
|
45
|
+
queue storage accounted by this implementation, not whole-process RSS or an
|
|
46
|
+
enforced operating-system memory limit. Tests compare partial bounds against
|
|
47
|
+
independently scored exhaustive completions and complete tiny mapping sets.
|