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,750 @@
|
|
|
1
|
+
/*****************************************************************************
|
|
2
|
+
* *
|
|
3
|
+
* Auxiliary source file for version 2.9 of nauty. *
|
|
4
|
+
* *
|
|
5
|
+
* Subject to the conditions and dislaimers in the file COPYRIGHT. *
|
|
6
|
+
* *
|
|
7
|
+
* CHANGE HISTORY *
|
|
8
|
+
* 10-Nov-87 : final changes for version 1.2 *
|
|
9
|
+
* 5-Dec-87 : renamed to version 1.3 (no changes to this file) *
|
|
10
|
+
* 28-Sep-88 : renamed to version 1.4 (no changes to this file) *
|
|
11
|
+
* 23-Mar-89 : changes for version 1.5 : *
|
|
12
|
+
* - added procedure refine1() *
|
|
13
|
+
* - changed type of ptn from int* to nvector* in fmptn() *
|
|
14
|
+
* - declared level in breakout() *
|
|
15
|
+
* - changed char[] to char* in a few places *
|
|
16
|
+
* - minor rearrangement in bestcell() *
|
|
17
|
+
* 31-Mar-89 : - added procedure doref() *
|
|
18
|
+
* 5-Apr-89 : - changed MAKEEMPTY uses to EMPTYSET *
|
|
19
|
+
* 12-Apr-89 : - changed writeperm() and fmperm() to not use MARKing *
|
|
20
|
+
* 5-May-89 : - redefined MASH to gain about 8% efficiency *
|
|
21
|
+
* 18-Oct-90 : changes for version 1.6 : *
|
|
22
|
+
* - improved line breaking in writeperm() *
|
|
23
|
+
* 10-Nov-90 : - added dummy routine nautil_null() *
|
|
24
|
+
* 27-Aug-92 : changes for version 1.7 : *
|
|
25
|
+
* - made linelength <= 0 mean no line breaks *
|
|
26
|
+
* 5-Jun-93 : renamed to version 1.7+ (no changes to this file) *
|
|
27
|
+
* 18-Aug-93 : renamed to version 1.8 (no changes to this file) *
|
|
28
|
+
* 17-Sep-93 : renamed to version 1.9 (no changes to this file) *
|
|
29
|
+
* 29-Jun-95 : changes for version 1.10 : *
|
|
30
|
+
* - replaced loop in nextelement() to save reference past *
|
|
31
|
+
* end of array (thanks to Kevin Maylsiak) *
|
|
32
|
+
* 11-Jul-96 : changes for version 2.0 : *
|
|
33
|
+
* - added alloc_error() *
|
|
34
|
+
* - added dynamic allocation *
|
|
35
|
+
* 21-Oct-98 : use 077777 in place of INFINITY for CLEANUP() *
|
|
36
|
+
* 9-Jan-00 : added nautil_check() *
|
|
37
|
+
* 12-Feb-00 : did a little formating of the code *
|
|
38
|
+
* 28-May-00 : added nautil_freedyn() *
|
|
39
|
+
* 16-Aug-00 : added OLDNAUTY behaviour *
|
|
40
|
+
* 16-Nov-00 : moved graph-specific things to naugraph.c *
|
|
41
|
+
* use function prototypes, remove UPROC, nvector *
|
|
42
|
+
* 22-Apr-01 : added code for compilation into Magma *
|
|
43
|
+
* removed nautil_null() *
|
|
44
|
+
* removed EXTDEFS and included labelorg *
|
|
45
|
+
* 21-Nov-01 : use NAUTYREQUIRED in nautil_check() *
|
|
46
|
+
* 26-Jun-02 : revised permset() to avoid fetch past the end of *
|
|
47
|
+
* the array (thanks to Jan Kieffer) *
|
|
48
|
+
* 17-Nov-03 : changed INFINITY to NAUTY_INFINITY *
|
|
49
|
+
* 14-Sep-04 : extended prototypes to recursive functions *
|
|
50
|
+
* 23-Nov-06 : replave targetcell() by maketargetcell() *
|
|
51
|
+
* 10-Dec-06 : remove BIGNAUTY *
|
|
52
|
+
* 10-Dec-10 : remove shortish and permutation types *
|
|
53
|
+
* 11-May-10 : use sorttemplates.c *
|
|
54
|
+
* 27-Mar-11 : add writegroupsize() *
|
|
55
|
+
* 15-Jan-12 : add TLS_ATTR attributes *
|
|
56
|
+
* 16-Sep-12 : small change to objoin(), more efficient for sparse case *
|
|
57
|
+
* 22-Sep-12 : change documentation of orbjoin() *
|
|
58
|
+
* 18-Jan-12 : changes for version 2.6 : *
|
|
59
|
+
* - declare nauty_kill_request *
|
|
60
|
+
* 8-May-20 : add const declarations to prototypes *
|
|
61
|
+
* 22-Jan-25 : moved the noreturn attribute on alloc_error() *
|
|
62
|
+
* *
|
|
63
|
+
*****************************************************************************/
|
|
64
|
+
|
|
65
|
+
#define ONE_WORD_SETS
|
|
66
|
+
#include "nauty.h"
|
|
67
|
+
#ifdef NAUTY_IN_MAGMA
|
|
68
|
+
#include "io.e"
|
|
69
|
+
#endif
|
|
70
|
+
|
|
71
|
+
/* macros for hash-codes: */
|
|
72
|
+
/* Don't use NAUTY_INFINITY here as that would make the canonical
|
|
73
|
+
* labelling depend on whether BIGNAUTY is in operation */
|
|
74
|
+
#define MASH(l,i) ((((l) ^ 065435) + (i)) & 077777)
|
|
75
|
+
/* : expression whose long value depends only on long l and int/long i.
|
|
76
|
+
Anything goes, preferably non-commutative. */
|
|
77
|
+
|
|
78
|
+
#define CLEANUP(l) ((int)((l) % 077777))
|
|
79
|
+
/* : expression whose value depends on long l and is less than 077777
|
|
80
|
+
when converted to int then short. Anything goes. */
|
|
81
|
+
|
|
82
|
+
#if MAXM==1
|
|
83
|
+
#define M 1
|
|
84
|
+
#else
|
|
85
|
+
#define M m
|
|
86
|
+
#endif
|
|
87
|
+
|
|
88
|
+
#if !MAXN
|
|
89
|
+
DYNALLSTAT(int,workperm,workperm_sz);
|
|
90
|
+
#else
|
|
91
|
+
static TLS_ATTR int workperm[MAXN];
|
|
92
|
+
#endif
|
|
93
|
+
|
|
94
|
+
int labelorg = 0; /* no TLS_ATTR on purpose */
|
|
95
|
+
volatile int nauty_kill_request = 0; /* no TLS_ATTR on purpose */
|
|
96
|
+
|
|
97
|
+
/* aproto: header new_nauty_protos.h */
|
|
98
|
+
|
|
99
|
+
/*****************************************************************************
|
|
100
|
+
* *
|
|
101
|
+
* nextelement(set1,m,pos) = the position of the first element in set set1 *
|
|
102
|
+
* which occupies a position greater than pos. If no such element exists, *
|
|
103
|
+
* the value is -1. pos can have any value less than n, including negative *
|
|
104
|
+
* values. *
|
|
105
|
+
* *
|
|
106
|
+
* GLOBALS ACCESSED: none *
|
|
107
|
+
* *
|
|
108
|
+
*****************************************************************************/
|
|
109
|
+
|
|
110
|
+
int
|
|
111
|
+
nextelement(const set *set1, int m, int pos)
|
|
112
|
+
{
|
|
113
|
+
setword setwd;
|
|
114
|
+
int w;
|
|
115
|
+
|
|
116
|
+
if (m == 1)
|
|
117
|
+
{
|
|
118
|
+
if (pos < 0) setwd = set1[0];
|
|
119
|
+
else setwd = set1[0] & BITMASK(pos);
|
|
120
|
+
|
|
121
|
+
if (setwd == 0) return -1;
|
|
122
|
+
else return FIRSTBITNZ(setwd);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (pos < 0)
|
|
126
|
+
{
|
|
127
|
+
w = 0;
|
|
128
|
+
setwd = set1[0];
|
|
129
|
+
}
|
|
130
|
+
else
|
|
131
|
+
{
|
|
132
|
+
w = SETWD(pos);
|
|
133
|
+
setwd = set1[w] & BITMASK(SETBT(pos));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
for (;;)
|
|
137
|
+
{
|
|
138
|
+
if (setwd != 0) return TIMESWORDSIZE(w) + FIRSTBITNZ(setwd);
|
|
139
|
+
if (++w == m) return -1;
|
|
140
|
+
setwd = set1[w];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*****************************************************************************
|
|
145
|
+
* *
|
|
146
|
+
* permset(set1,set2,m,perm) defines set2 to be the set *
|
|
147
|
+
* {perm[i] | i in set1}. *
|
|
148
|
+
* *
|
|
149
|
+
* GLOBALS ACCESSED: bit<r>,leftbit<r> *
|
|
150
|
+
* *
|
|
151
|
+
*****************************************************************************/
|
|
152
|
+
|
|
153
|
+
void
|
|
154
|
+
permset(const set *set1, set *set2, int m, int *perm)
|
|
155
|
+
{
|
|
156
|
+
setword setw;
|
|
157
|
+
int pos,b;
|
|
158
|
+
int w;
|
|
159
|
+
|
|
160
|
+
if (m == 1)
|
|
161
|
+
{
|
|
162
|
+
*set2 = 0;
|
|
163
|
+
setw = set1[0];
|
|
164
|
+
while (setw != 0)
|
|
165
|
+
{
|
|
166
|
+
TAKEBIT(b,setw);
|
|
167
|
+
*set2 |= bit[perm[b]];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else
|
|
171
|
+
{
|
|
172
|
+
EMPTYSET0(set2,m);
|
|
173
|
+
for (w = 0; w < m; ++w)
|
|
174
|
+
{
|
|
175
|
+
setw = set1[w];
|
|
176
|
+
while (setw != 0)
|
|
177
|
+
{
|
|
178
|
+
TAKEBIT(b,setw);
|
|
179
|
+
pos = perm[TIMESWORDSIZE(w)+b];
|
|
180
|
+
ADDELEMENT0(set2,pos);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/*****************************************************************************
|
|
187
|
+
* *
|
|
188
|
+
* putstring(f,s) writes the nul-terminated string s to file f. *
|
|
189
|
+
* *
|
|
190
|
+
*****************************************************************************/
|
|
191
|
+
|
|
192
|
+
void
|
|
193
|
+
putstring(FILE *f, const char *s)
|
|
194
|
+
{
|
|
195
|
+
while (*s != '\0')
|
|
196
|
+
{
|
|
197
|
+
PUTC(*s,f);
|
|
198
|
+
++s;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/*****************************************************************************
|
|
203
|
+
* *
|
|
204
|
+
* itos(i,s) converts the int i to a nul-terminated decimal character *
|
|
205
|
+
* string s. The value returned is the number of characters excluding *
|
|
206
|
+
* the nul. *
|
|
207
|
+
* *
|
|
208
|
+
* GLOBALS ACCESSED: NONE *
|
|
209
|
+
* *
|
|
210
|
+
*****************************************************************************/
|
|
211
|
+
|
|
212
|
+
int
|
|
213
|
+
itos(int i, char *s)
|
|
214
|
+
{
|
|
215
|
+
int digit,j,k;
|
|
216
|
+
char c;
|
|
217
|
+
int ans;
|
|
218
|
+
|
|
219
|
+
if (i < 0)
|
|
220
|
+
{
|
|
221
|
+
k = 0;
|
|
222
|
+
i = -i;
|
|
223
|
+
j = 1;
|
|
224
|
+
s[0] = '-';
|
|
225
|
+
}
|
|
226
|
+
else
|
|
227
|
+
{
|
|
228
|
+
k = -1;
|
|
229
|
+
j = 0;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
do
|
|
233
|
+
{
|
|
234
|
+
digit = i % 10;
|
|
235
|
+
i = i / 10;
|
|
236
|
+
s[++k] = (char)(digit + '0');
|
|
237
|
+
}
|
|
238
|
+
while (i);
|
|
239
|
+
|
|
240
|
+
s[k+1] = '\0';
|
|
241
|
+
ans = k + 1;
|
|
242
|
+
|
|
243
|
+
for (; j < k; ++j, --k)
|
|
244
|
+
{
|
|
245
|
+
c = s[j];
|
|
246
|
+
s[j] = s[k];
|
|
247
|
+
s[k] = c;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return ans;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/*****************************************************************************
|
|
254
|
+
* *
|
|
255
|
+
* orbits represents a partition of {0,1,...,n-1}, by orbits[i] = the *
|
|
256
|
+
* smallest element in the same cell as i. map[] is any array with values *
|
|
257
|
+
* in {0,1,...,n-1}. orbjoin(orbits,map,n) joins the cells of orbits[] *
|
|
258
|
+
* together to the minimum extent such that for each i, i and map[i] are in *
|
|
259
|
+
* the same cell. The function value returned is the new number of cells. *
|
|
260
|
+
* *
|
|
261
|
+
* GLOBALS ACCESSED: NONE *
|
|
262
|
+
* *
|
|
263
|
+
*****************************************************************************/
|
|
264
|
+
|
|
265
|
+
int
|
|
266
|
+
orbjoin(int *orbits, const int *map, int n)
|
|
267
|
+
{
|
|
268
|
+
int i,j1,j2;
|
|
269
|
+
|
|
270
|
+
for (i = 0; i < n; ++i)
|
|
271
|
+
if (map[i] != i)
|
|
272
|
+
{
|
|
273
|
+
j1 = orbits[i];
|
|
274
|
+
while (orbits[j1] != j1) j1 = orbits[j1];
|
|
275
|
+
j2 = orbits[map[i]];
|
|
276
|
+
while (orbits[j2] != j2) j2 = orbits[j2];
|
|
277
|
+
|
|
278
|
+
if (j1 < j2) orbits[j2] = j1;
|
|
279
|
+
else if (j1 > j2) orbits[j1] = j2;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
j1 = 0;
|
|
283
|
+
for (i = 0; i < n; ++i)
|
|
284
|
+
if ((orbits[i] = orbits[orbits[i]]) == i) ++j1;
|
|
285
|
+
|
|
286
|
+
return j1;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/*****************************************************************************
|
|
290
|
+
* *
|
|
291
|
+
* writeperm(f,perm,cartesian,linelength,n) writes the permutation perm to *
|
|
292
|
+
* the file f. The cartesian representation (i.e. perm itself) is used if *
|
|
293
|
+
* cartesian != FALSE; otherwise the cyclic representation is used. No *
|
|
294
|
+
* more than linelength characters (not counting '\n') are written on each *
|
|
295
|
+
* line, unless linelength is ridiculously small. linelength<=0 causes no *
|
|
296
|
+
* line breaks at all to be made. The global int labelorg is added to each *
|
|
297
|
+
* vertex number. *
|
|
298
|
+
* *
|
|
299
|
+
* GLOBALS ACCESSED: itos(),putstring() *
|
|
300
|
+
* *
|
|
301
|
+
*****************************************************************************/
|
|
302
|
+
|
|
303
|
+
void
|
|
304
|
+
writeperm(FILE *f, const int *perm, boolean cartesian, int linelength, int n)
|
|
305
|
+
{
|
|
306
|
+
int i,k,l,curlen,intlen;
|
|
307
|
+
char s[30];
|
|
308
|
+
|
|
309
|
+
#if !MAXN
|
|
310
|
+
DYNALLOC1(int,workperm,workperm_sz,n,"writeperm");
|
|
311
|
+
#endif
|
|
312
|
+
|
|
313
|
+
/* CONDNL(x) writes end-of-line and 3 spaces if x characters
|
|
314
|
+
won't fit on the current line. */
|
|
315
|
+
#define CONDNL(x) if (linelength>0 && curlen+(x)>linelength)\
|
|
316
|
+
{putstring(f,"\n ");curlen=3;}
|
|
317
|
+
|
|
318
|
+
curlen = 0;
|
|
319
|
+
if (cartesian)
|
|
320
|
+
{
|
|
321
|
+
for (i = 0; i < n; ++i)
|
|
322
|
+
{
|
|
323
|
+
intlen = itos(perm[i]+labelorg,s);
|
|
324
|
+
CONDNL(intlen+1);
|
|
325
|
+
PUTC(' ',f);
|
|
326
|
+
putstring(f,s);
|
|
327
|
+
curlen += intlen + 1;
|
|
328
|
+
}
|
|
329
|
+
PUTC('\n',f);
|
|
330
|
+
}
|
|
331
|
+
else
|
|
332
|
+
{
|
|
333
|
+
for (i = n; --i >= 0;) workperm[i] = 0;
|
|
334
|
+
|
|
335
|
+
for (i = 0; i < n; ++i)
|
|
336
|
+
{
|
|
337
|
+
if (workperm[i] == 0 && perm[i] != i)
|
|
338
|
+
{
|
|
339
|
+
l = i;
|
|
340
|
+
intlen = itos(l+labelorg,s);
|
|
341
|
+
if (curlen > 3) CONDNL(2*intlen+4);
|
|
342
|
+
PUTC('(',f);
|
|
343
|
+
do
|
|
344
|
+
{
|
|
345
|
+
putstring(f,s);
|
|
346
|
+
curlen += intlen + 1;
|
|
347
|
+
k = l;
|
|
348
|
+
l = perm[l];
|
|
349
|
+
workperm[k] = 1;
|
|
350
|
+
if (l != i)
|
|
351
|
+
{
|
|
352
|
+
intlen = itos(l+labelorg,s);
|
|
353
|
+
CONDNL(intlen+2);
|
|
354
|
+
PUTC(' ',f);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
while (l != i);
|
|
358
|
+
PUTC(')',f);
|
|
359
|
+
++curlen;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (curlen == 0) putstring(f,"(1)\n");
|
|
364
|
+
else PUTC('\n',f);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/*****************************************************************************
|
|
369
|
+
* *
|
|
370
|
+
* fmperm(perm,fix,mcr,m,n) uses perm to construct fix and mcr. fix *
|
|
371
|
+
* contains those points are fixed by perm, while mcr contains the set of *
|
|
372
|
+
* those points which are least in their orbits. *
|
|
373
|
+
* *
|
|
374
|
+
* GLOBALS ACCESSED: bit<r> *
|
|
375
|
+
* *
|
|
376
|
+
*****************************************************************************/
|
|
377
|
+
|
|
378
|
+
void
|
|
379
|
+
fmperm(const int *perm, set *fix, set *mcr, int m, int n)
|
|
380
|
+
{
|
|
381
|
+
int i,k,l;
|
|
382
|
+
|
|
383
|
+
#if !MAXN
|
|
384
|
+
DYNALLOC1(int,workperm,workperm_sz,n,"writeperm");
|
|
385
|
+
#endif
|
|
386
|
+
|
|
387
|
+
EMPTYSET(fix,m);
|
|
388
|
+
EMPTYSET(mcr,m);
|
|
389
|
+
|
|
390
|
+
for (i = n; --i >= 0;) workperm[i] = 0;
|
|
391
|
+
|
|
392
|
+
for (i = 0; i < n; ++i)
|
|
393
|
+
if (perm[i] == i)
|
|
394
|
+
{
|
|
395
|
+
ADDELEMENT(fix,i);
|
|
396
|
+
ADDELEMENT(mcr,i);
|
|
397
|
+
}
|
|
398
|
+
else if (workperm[i] == 0)
|
|
399
|
+
{
|
|
400
|
+
l = i;
|
|
401
|
+
do
|
|
402
|
+
{
|
|
403
|
+
k = l;
|
|
404
|
+
l = perm[l];
|
|
405
|
+
workperm[k] = 1;
|
|
406
|
+
}
|
|
407
|
+
while (l != i);
|
|
408
|
+
|
|
409
|
+
ADDELEMENT(mcr,i);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/*****************************************************************************
|
|
414
|
+
* *
|
|
415
|
+
* fmptn(lab,ptn,level,fix,mcr,m,n) uses the partition at the specified *
|
|
416
|
+
* level in the partition nest (lab,ptn) to make sets fix and mcr. fix *
|
|
417
|
+
* represents the points in trivial cells of the partition, while mcr *
|
|
418
|
+
* represents those points which are least in their cells. *
|
|
419
|
+
* *
|
|
420
|
+
* GLOBALS ACCESSED: bit<r> *
|
|
421
|
+
* *
|
|
422
|
+
*****************************************************************************/
|
|
423
|
+
|
|
424
|
+
void
|
|
425
|
+
fmptn(const int *lab, const int *ptn, int level, set *fix, set *mcr, int m, int n)
|
|
426
|
+
{
|
|
427
|
+
int i,lmin;
|
|
428
|
+
|
|
429
|
+
EMPTYSET(fix,m);
|
|
430
|
+
EMPTYSET(mcr,m);
|
|
431
|
+
|
|
432
|
+
for (i = 0; i < n; ++i)
|
|
433
|
+
if (ptn[i] <= level)
|
|
434
|
+
{
|
|
435
|
+
ADDELEMENT(fix,lab[i]);
|
|
436
|
+
ADDELEMENT(mcr,lab[i]);
|
|
437
|
+
}
|
|
438
|
+
else
|
|
439
|
+
{
|
|
440
|
+
lmin = lab[i];
|
|
441
|
+
do
|
|
442
|
+
if (lab[++i] < lmin) lmin = lab[i];
|
|
443
|
+
while (ptn[i] > level);
|
|
444
|
+
ADDELEMENT(mcr,lmin);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
#define SORT_TYPE1 int
|
|
449
|
+
#define SORT_TYPE2 int
|
|
450
|
+
#define SORT_OF_SORT 2
|
|
451
|
+
#define SORT_NAME sortparallel
|
|
452
|
+
#include "sorttemplates.c"
|
|
453
|
+
|
|
454
|
+
/*****************************************************************************
|
|
455
|
+
* *
|
|
456
|
+
* doref(g,lab,ptn,level,numcells,qinvar,invar,active,code,refproc, *
|
|
457
|
+
* invarproc,mininvarlev,maxinvarlev,invararg,digraph,m,n) *
|
|
458
|
+
* is used to perform a refinement on the partition at the given level in *
|
|
459
|
+
* (lab,ptn). The number of cells is *numcells both for input and output. *
|
|
460
|
+
* The input active is the active set for input to the refinement procedure *
|
|
461
|
+
* (*refproc)(), which must have the argument list of refine(). *
|
|
462
|
+
* active may be arbitrarily changed. invar is used for working storage. *
|
|
463
|
+
* First, (*refproc)() is called. Then, if invarproc!=NULL and *
|
|
464
|
+
* |mininvarlev| <= level <= |maxinvarlev|, the routine (*invarproc)() is *
|
|
465
|
+
* used to compute a vertex-invariant which may refine the partition *
|
|
466
|
+
* further. If it does, (*refproc)() is called again, using an active set *
|
|
467
|
+
* containing all but the first fragment of each old cell. Unless g is a *
|
|
468
|
+
* digraph, this guarantees that the final partition is equitable. The *
|
|
469
|
+
* arguments invararg and digraph are passed to (*invarproc)() *
|
|
470
|
+
* uninterpretted. The output argument code is a composite of the codes *
|
|
471
|
+
* from all the calls to (*refproc)(). The output argument qinvar is set *
|
|
472
|
+
* to 0 if (*invarproc)() is not applied, 1 if it is applied but fails to *
|
|
473
|
+
* refine the partition, and 2 if it succeeds. *
|
|
474
|
+
* See the file nautinv.c for a further discussion of vertex-invariants. *
|
|
475
|
+
* Note that the dreadnaut I command generates a call to this procedure *
|
|
476
|
+
* with level = mininvarlevel = maxinvarlevel = 0. *
|
|
477
|
+
* *
|
|
478
|
+
*****************************************************************************/
|
|
479
|
+
|
|
480
|
+
void
|
|
481
|
+
doref(graph *g, int *lab, int *ptn, int level, int *numcells,
|
|
482
|
+
int *qinvar, int *invar, set *active, int *code,
|
|
483
|
+
void (*refproc)(graph*,int*,int*,int,int*,int*,set*,int*,int,int),
|
|
484
|
+
void (*invarproc)(graph*,int*,int*,int,int,int,int*,
|
|
485
|
+
int,boolean,int,int),
|
|
486
|
+
int mininvarlev, int maxinvarlev, int invararg,
|
|
487
|
+
boolean digraph, int m, int n)
|
|
488
|
+
{
|
|
489
|
+
int pw;
|
|
490
|
+
int i,cell1,cell2,nc,tvpos,minlev,maxlev;
|
|
491
|
+
long longcode;
|
|
492
|
+
boolean same;
|
|
493
|
+
|
|
494
|
+
#if !MAXN
|
|
495
|
+
DYNALLOC1(int,workperm,workperm_sz,n,"doref");
|
|
496
|
+
#endif
|
|
497
|
+
|
|
498
|
+
if ((tvpos = nextelement(active,M,-1)) < 0) tvpos = 0;
|
|
499
|
+
|
|
500
|
+
(*refproc)(g,lab,ptn,level,numcells,invar,active,code,M,n);
|
|
501
|
+
|
|
502
|
+
minlev = (mininvarlev < 0 ? -mininvarlev : mininvarlev);
|
|
503
|
+
maxlev = (maxinvarlev < 0 ? -maxinvarlev : maxinvarlev);
|
|
504
|
+
if (invarproc != NULL && *numcells < n
|
|
505
|
+
&& level >= minlev && level <= maxlev)
|
|
506
|
+
{
|
|
507
|
+
(*invarproc)(g,lab,ptn,level,*numcells,tvpos,invar,invararg,
|
|
508
|
+
digraph,M,n);
|
|
509
|
+
EMPTYSET(active,m);
|
|
510
|
+
for (i = n; --i >= 0;) workperm[i] = invar[lab[i]];
|
|
511
|
+
nc = *numcells;
|
|
512
|
+
for (cell1 = 0; cell1 < n; cell1 = cell2 + 1)
|
|
513
|
+
{
|
|
514
|
+
pw = workperm[cell1];
|
|
515
|
+
same = TRUE;
|
|
516
|
+
for (cell2 = cell1; ptn[cell2] > level; ++cell2)
|
|
517
|
+
if (workperm[cell2+1] != pw) same = FALSE;
|
|
518
|
+
|
|
519
|
+
if (same) continue;
|
|
520
|
+
|
|
521
|
+
sortparallel(workperm+cell1, lab+cell1, cell2-cell1+1);
|
|
522
|
+
|
|
523
|
+
for (i = cell1 + 1; i <= cell2; ++i)
|
|
524
|
+
if (workperm[i] != workperm[i-1])
|
|
525
|
+
{
|
|
526
|
+
ptn[i-1] = level;
|
|
527
|
+
++*numcells;
|
|
528
|
+
ADDELEMENT(active,i);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
if (*numcells > nc)
|
|
533
|
+
{
|
|
534
|
+
*qinvar = 2;
|
|
535
|
+
longcode = *code;
|
|
536
|
+
(*refproc)(g,lab,ptn,level,numcells,invar,active,code,M,n);
|
|
537
|
+
longcode = MASH(longcode,*code);
|
|
538
|
+
*code = CLEANUP(longcode);
|
|
539
|
+
}
|
|
540
|
+
else
|
|
541
|
+
*qinvar = 1;
|
|
542
|
+
}
|
|
543
|
+
else
|
|
544
|
+
*qinvar = 0;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/*****************************************************************************
|
|
548
|
+
* *
|
|
549
|
+
* maketargetcell(g,lab,ptn,level,tcell,tcellsize,&cellpos, *
|
|
550
|
+
* tc_level,digraph,hint,targetcell,m,n) *
|
|
551
|
+
* calls targetcell() to determine the target cell at the specified level *
|
|
552
|
+
* in the partition nest (lab,ptn). It must be a nontrivial cell (if not, *
|
|
553
|
+
* the first cell. The intention of hint is that, if hint >= 0 and there *
|
|
554
|
+
* is a suitable non-trivial cell starting at position hint in lab, *
|
|
555
|
+
* that cell is chosen. *
|
|
556
|
+
* tc_level and digraph are input options. *
|
|
557
|
+
* When a cell is chosen, tcell is set to its contents, *tcellsize to its *
|
|
558
|
+
* size, and cellpos to its starting position in lab. *
|
|
559
|
+
* *
|
|
560
|
+
* GLOBALS ACCESSED: bit<r> *
|
|
561
|
+
* *
|
|
562
|
+
*****************************************************************************/
|
|
563
|
+
|
|
564
|
+
void
|
|
565
|
+
maketargetcell(graph *g, int *lab, int *ptn, int level,
|
|
566
|
+
set *tcell, int *tcellsize, int *cellpos, int tc_level,
|
|
567
|
+
boolean digraph, int hint,
|
|
568
|
+
int (*targetcell)(graph*,int*,int*,int,int,boolean,int,int,int),
|
|
569
|
+
int m, int n)
|
|
570
|
+
{
|
|
571
|
+
int i,j,k;
|
|
572
|
+
|
|
573
|
+
i = (*targetcell)(g,lab,ptn,level,tc_level,digraph,hint,m,n);
|
|
574
|
+
for (j = i + 1; ptn[j] > level; ++j) {}
|
|
575
|
+
|
|
576
|
+
*tcellsize = j - i + 1;
|
|
577
|
+
|
|
578
|
+
EMPTYSET(tcell,m);
|
|
579
|
+
for (k = i; k <= j; ++k) ADDELEMENT(tcell,lab[k]);
|
|
580
|
+
|
|
581
|
+
*cellpos = i;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/*****************************************************************************
|
|
585
|
+
* *
|
|
586
|
+
* shortprune(set1,set2,m) ANDs the contents of set set2 into set set1. *
|
|
587
|
+
* *
|
|
588
|
+
* GLOBALS ACCESSED: NONE *
|
|
589
|
+
* *
|
|
590
|
+
*****************************************************************************/
|
|
591
|
+
|
|
592
|
+
void
|
|
593
|
+
shortprune(set *set1, const set *set2, int m)
|
|
594
|
+
{
|
|
595
|
+
int i;
|
|
596
|
+
|
|
597
|
+
for (i = 0; i < M; ++i) INTERSECT(set1[i],set2[i]);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/*****************************************************************************
|
|
601
|
+
* *
|
|
602
|
+
* breakout(lab,ptn,level,tc,tv,active,m) operates on the partition at *
|
|
603
|
+
* the specified level in the partition nest (lab,ptn). It finds the *
|
|
604
|
+
* element tv, which is in the cell C starting at index tc in lab (it had *
|
|
605
|
+
* better be) and splits C in the two cells {tv} and C\{tv}, in that order. *
|
|
606
|
+
* It also sets the set active to contain just the element tc. *
|
|
607
|
+
* *
|
|
608
|
+
* GLOBALS ACCESSED: bit<r> *
|
|
609
|
+
* *
|
|
610
|
+
*****************************************************************************/
|
|
611
|
+
|
|
612
|
+
void
|
|
613
|
+
breakout(int *lab, int *ptn, int level, int tc, int tv,
|
|
614
|
+
set *active, int m)
|
|
615
|
+
{
|
|
616
|
+
int i,prev,next;
|
|
617
|
+
|
|
618
|
+
EMPTYSET(active,m);
|
|
619
|
+
ADDELEMENT(active,tc);
|
|
620
|
+
|
|
621
|
+
i = tc;
|
|
622
|
+
prev = tv;
|
|
623
|
+
|
|
624
|
+
do
|
|
625
|
+
{
|
|
626
|
+
next = lab[i];
|
|
627
|
+
lab[i++] = prev;
|
|
628
|
+
prev = next;
|
|
629
|
+
}
|
|
630
|
+
while (prev != tv);
|
|
631
|
+
|
|
632
|
+
ptn[tc] = level;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/*****************************************************************************
|
|
636
|
+
* *
|
|
637
|
+
* longprune(tcell,fix,bottom,top,m) removes zero or elements of the set *
|
|
638
|
+
* tcell. It is assumed that addresses bottom through top-1 contain *
|
|
639
|
+
* contiguous pairs of sets (f1,m1),(f2,m2), ... . tcell is intersected *
|
|
640
|
+
* with each mi such that fi is a subset of fix. *
|
|
641
|
+
* *
|
|
642
|
+
* GLOBALS ACCESSED: NONE *
|
|
643
|
+
* *
|
|
644
|
+
*****************************************************************************/
|
|
645
|
+
|
|
646
|
+
void
|
|
647
|
+
longprune(set *tcell, set *fix, set *bottom, set *top, int m)
|
|
648
|
+
{
|
|
649
|
+
int i;
|
|
650
|
+
|
|
651
|
+
while (bottom < top)
|
|
652
|
+
{
|
|
653
|
+
for (i = 0; i < M; ++i)
|
|
654
|
+
if (NOTSUBSET(fix[i],bottom[i])) break;
|
|
655
|
+
bottom += M;
|
|
656
|
+
|
|
657
|
+
if (i == M)
|
|
658
|
+
for (i = 0; i < M; ++i) INTERSECT(tcell[i],bottom[i]);
|
|
659
|
+
bottom += M;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/*****************************************************************************
|
|
664
|
+
* *
|
|
665
|
+
* writegroupsize(f,gpsize1,gpsize2) writes a real number gpsize1*10^gpsize2 *
|
|
666
|
+
* It is assumed that gpsize1 >= 1 and that gpsize1 equals an integer in the *
|
|
667
|
+
* case that gpsize2==0. These assumptions are true for group sizes *
|
|
668
|
+
* computed by nauty. *
|
|
669
|
+
* *
|
|
670
|
+
*****************************************************************************/
|
|
671
|
+
|
|
672
|
+
void
|
|
673
|
+
writegroupsize(FILE *f, double gpsize1, int gpsize2)
|
|
674
|
+
{
|
|
675
|
+
if (gpsize2 == 0)
|
|
676
|
+
fprintf(f,"%.0f",gpsize1+0.1);
|
|
677
|
+
else
|
|
678
|
+
{
|
|
679
|
+
while (gpsize1 >= 10.0)
|
|
680
|
+
{
|
|
681
|
+
gpsize1 /= 10.0;
|
|
682
|
+
++gpsize2;
|
|
683
|
+
}
|
|
684
|
+
fprintf(f,"%14.12fe%d",gpsize1,gpsize2);
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/*****************************************************************************
|
|
689
|
+
* *
|
|
690
|
+
* nautil_check() checks that this file is compiled compatibly with the *
|
|
691
|
+
* given parameters. If not, call exit(1). *
|
|
692
|
+
* *
|
|
693
|
+
*****************************************************************************/
|
|
694
|
+
|
|
695
|
+
void
|
|
696
|
+
nautil_check(int wordsize, int m, int n, int version)
|
|
697
|
+
{
|
|
698
|
+
if (wordsize != WORDSIZE)
|
|
699
|
+
{
|
|
700
|
+
fprintf(ERRFILE,"Error: WORDSIZE mismatch in nautil.c\n");
|
|
701
|
+
exit(1);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
#if MAXN
|
|
705
|
+
if (m > MAXM)
|
|
706
|
+
{
|
|
707
|
+
fprintf(ERRFILE,"Error: MAXM inadequate in nautil.c\n");
|
|
708
|
+
exit(1);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
if (n > MAXN)
|
|
712
|
+
{
|
|
713
|
+
fprintf(ERRFILE,"Error: MAXN inadequate in nautil.c\n");
|
|
714
|
+
exit(1);
|
|
715
|
+
}
|
|
716
|
+
#endif
|
|
717
|
+
|
|
718
|
+
if (version < NAUTYREQUIRED)
|
|
719
|
+
{
|
|
720
|
+
fprintf(ERRFILE,"Error: nautil.c version mismatch\n");
|
|
721
|
+
exit(1);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/*****************************************************************************
|
|
726
|
+
* *
|
|
727
|
+
* alloc_error() writes a message and exits. Used by DYNALLOC? macros. *
|
|
728
|
+
* *
|
|
729
|
+
*****************************************************************************/
|
|
730
|
+
|
|
731
|
+
NORET_ATTR void
|
|
732
|
+
alloc_error(const char *s)
|
|
733
|
+
{
|
|
734
|
+
fprintf(ERRFILE,"Dynamic allocation failed: %s\n",s);
|
|
735
|
+
exit(2);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/*****************************************************************************
|
|
739
|
+
* *
|
|
740
|
+
* nautil_freedyn() - free the dynamic memory in this module *
|
|
741
|
+
* *
|
|
742
|
+
*****************************************************************************/
|
|
743
|
+
|
|
744
|
+
void
|
|
745
|
+
nautil_freedyn(void)
|
|
746
|
+
{
|
|
747
|
+
#if !MAXN
|
|
748
|
+
DYNFREE(workperm,workperm_sz);
|
|
749
|
+
#endif
|
|
750
|
+
}
|