passagemath-categories 10.6.32__cp314-cp314t-musllinux_1_2_aarch64.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.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,906 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
# sage.doctest: needs sage.groups
|
|
3
|
+
r"""
|
|
4
|
+
Automorphism groups and canonical labels
|
|
5
|
+
|
|
6
|
+
This module implements a general algorithm for computing automorphism groups and
|
|
7
|
+
canonical labels of objects. The class of objects in question must be some kind
|
|
8
|
+
of structure for which an automorphism is a permutation in $S_n$ for some $n$,
|
|
9
|
+
which we call here the order of the object. It should be noted that the word
|
|
10
|
+
"canonical" in the term canonical label is used loosely. Given an object $X$,
|
|
11
|
+
the canonical label $C(X)$ is just an object for which $C(X) = C(Y)$ for any
|
|
12
|
+
$Y$ such that $X \cong Y$.
|
|
13
|
+
|
|
14
|
+
To understand the algorithm better, a few definitions will help. First one
|
|
15
|
+
should note that throughout this module, $S_n$ is defined as the set of
|
|
16
|
+
permutations of the set $[n] := \{0, 1, ..., n-1\}$. One speaks of
|
|
17
|
+
ordered partitions $\Pi = (C_1, ..., C_k)$ of $[n]$. The $C_i$ are disjoint
|
|
18
|
+
subsets of $[n]$ whose union is equal to $[n]$, and we call them cells. A
|
|
19
|
+
partition $\Pi_1$ is said to be finer than another partition $\Pi_2$ if every
|
|
20
|
+
cell of $\Pi_1$ is a subset of some cell of $\Pi_2$ (in this situation we also
|
|
21
|
+
say that $\Pi_2$ is coarser than $\Pi_1$). A partition stack
|
|
22
|
+
$\nu = (\Pi_0, ..., \Pi_k)$ is a sequence of partitions such that $\Pi_i$ is
|
|
23
|
+
finer than $\Pi_{i-1}$ for each $i$ such that $1 \leq i \leq k$. Sometimes these
|
|
24
|
+
are called nested partitions. The depth of $\nu$ is defined to be $k$ and the
|
|
25
|
+
degree of $\nu$ is defined to be $n$. Partition stacks are implemented as
|
|
26
|
+
\code{PartitionStack} (see automorphism_group_canonical_label.pxd for more
|
|
27
|
+
information). Finally, we say that a permutation respects the partition $\Pi$ if
|
|
28
|
+
its orbits form a partition which is finer than $\Pi$.
|
|
29
|
+
|
|
30
|
+
In order to take advantage of the algorithms in this module for a specific kind
|
|
31
|
+
of object, one must implement (in Cython) three functions which will be specific
|
|
32
|
+
to the kind of objects in question. Pointers to these functions are passed to
|
|
33
|
+
the main function of the module, which is \code{get_aut_gp_and_can_lab}. For
|
|
34
|
+
specific examples of implementations of these functions, see any of the files in
|
|
35
|
+
\code{sage.groups.perm_gps.partn_ref} beginning with "refinement." They are:
|
|
36
|
+
|
|
37
|
+
A. \code{refine_and_return_invariant}:
|
|
38
|
+
|
|
39
|
+
Signature:
|
|
40
|
+
|
|
41
|
+
\code{int refine_and_return_invariant(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len)}
|
|
42
|
+
|
|
43
|
+
This function should split up cells in the partition at the top of the
|
|
44
|
+
partition stack in such a way that any automorphism that respects the
|
|
45
|
+
partition also respects the resulting partition. The array
|
|
46
|
+
cells_to_refine_by is a list of the beginning positions of some cells which
|
|
47
|
+
have been changed since the last refinement, of length ctrb_len. It is not
|
|
48
|
+
necessary to use this in an implementation of this function, but it will
|
|
49
|
+
affect performance. One should consult \code{refinement_graphs} for more
|
|
50
|
+
details and ideas for particular implementations.
|
|
51
|
+
|
|
52
|
+
Output:
|
|
53
|
+
|
|
54
|
+
An integer $I$ invariant under the orbits of $S_n$. That is, if
|
|
55
|
+
$\gamma \in S_n$, then
|
|
56
|
+
$$ I(G, PS, cells_to_refine_by) = I( \gamma(G), \gamma(PS), \gamma(cells_to_refine_by) ) .$$
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
B. \code{compare_structures}:
|
|
60
|
+
|
|
61
|
+
Signature:
|
|
62
|
+
|
|
63
|
+
\code{int compare_structures(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree)}
|
|
64
|
+
|
|
65
|
+
This function must implement a total ordering on the set of objects of fixed
|
|
66
|
+
order. Return:
|
|
67
|
+
-1 if \code{gamma_1^{-1}(S1) < gamma_2^{-1}(S2)},
|
|
68
|
+
0 if \code{gamma_1^{-1}(S1) == gamma_2^{-1}(S2)},
|
|
69
|
+
1 if \code{gamma_1^{-1}(S1) > gamma_2^{-1}(S2)}.
|
|
70
|
+
|
|
71
|
+
The value ``degree`` indicates the degree of the permutations ``gamma1`` and
|
|
72
|
+
``gamma_2``.
|
|
73
|
+
|
|
74
|
+
Important note:
|
|
75
|
+
|
|
76
|
+
The permutations are thought of as being input in inverse form, and this can
|
|
77
|
+
lead to subtle bugs. One is encouraged to consult existing implementations
|
|
78
|
+
to make sure the right thing is being done: this is so that you can avoid
|
|
79
|
+
*actually* needing to compute the inverse.
|
|
80
|
+
|
|
81
|
+
C. \code{all_children_are_equivalent}:
|
|
82
|
+
|
|
83
|
+
Signature:
|
|
84
|
+
|
|
85
|
+
\code{bint all_children_are_equivalent(PartitionStack *PS, void *S)}
|
|
86
|
+
|
|
87
|
+
This function must return False unless it is the case that each discrete
|
|
88
|
+
partition finer than the top of the partition stack is equivalent to the
|
|
89
|
+
others under some automorphism of S. The converse need not hold: if this is
|
|
90
|
+
indeed the case, it still may return False. This function is originally used
|
|
91
|
+
as a consequence of Lemma 2.25 in [1].
|
|
92
|
+
|
|
93
|
+
EXAMPLES::
|
|
94
|
+
|
|
95
|
+
sage: import sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label
|
|
96
|
+
|
|
97
|
+
REFERENCE:
|
|
98
|
+
|
|
99
|
+
- [1] McKay, Brendan D. Practical Graph Isomorphism. Congressus Numerantium,
|
|
100
|
+
Vol. 30 (1981), pp. 45-87.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
# ****************************************************************************
|
|
104
|
+
# Copyright (C) 2006 - 2011 Robert L. Miller <rlmillster@gmail.com>
|
|
105
|
+
#
|
|
106
|
+
# This program is free software: you can redistribute it and/or modify
|
|
107
|
+
# it under the terms of the GNU General Public License as published by
|
|
108
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
109
|
+
# (at your option) any later version.
|
|
110
|
+
# https://www.gnu.org/licenses/
|
|
111
|
+
# ****************************************************************************
|
|
112
|
+
|
|
113
|
+
from libc.string cimport memcmp, memcpy
|
|
114
|
+
from cysignals.memory cimport sig_malloc, sig_realloc, sig_free
|
|
115
|
+
|
|
116
|
+
from sage.groups.perm_gps.partn_ref.data_structures cimport *
|
|
117
|
+
from sage.data_structures.bitset_base cimport *
|
|
118
|
+
|
|
119
|
+
cdef inline int agcl_cmp(int a, int b) noexcept:
|
|
120
|
+
if a < b:
|
|
121
|
+
return -1
|
|
122
|
+
elif a == b:
|
|
123
|
+
return 0
|
|
124
|
+
else:
|
|
125
|
+
return 1
|
|
126
|
+
|
|
127
|
+
# Functions
|
|
128
|
+
|
|
129
|
+
cdef bint all_children_are_equivalent_trivial(PartitionStack *PS, void *S) noexcept:
|
|
130
|
+
return 0
|
|
131
|
+
|
|
132
|
+
cdef int refine_and_return_invariant_trivial(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len) noexcept:
|
|
133
|
+
return 0
|
|
134
|
+
|
|
135
|
+
cdef int compare_structures_trivial(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree) noexcept:
|
|
136
|
+
return 0
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_get_aut_gp_and_can_lab_trivially(int n=6,
|
|
140
|
+
list partition=[[0,1,2],[3,4],[5]], canonical_label=True, base=False):
|
|
141
|
+
"""
|
|
142
|
+
TESTS::
|
|
143
|
+
|
|
144
|
+
sage: tttt = sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label.test_get_aut_gp_and_can_lab_trivially
|
|
145
|
+
sage: tttt()
|
|
146
|
+
12
|
|
147
|
+
sage: tttt(canonical_label=False, base=False)
|
|
148
|
+
12
|
|
149
|
+
sage: tttt(canonical_label=False, base=True)
|
|
150
|
+
12
|
|
151
|
+
sage: tttt(canonical_label=True, base=True)
|
|
152
|
+
12
|
|
153
|
+
sage: tttt(n=0, partition=[])
|
|
154
|
+
1
|
|
155
|
+
sage: tttt(n=0, partition=[], canonical_label=False, base=False)
|
|
156
|
+
1
|
|
157
|
+
sage: tttt(n=0, partition=[], canonical_label=False, base=True)
|
|
158
|
+
1
|
|
159
|
+
sage: tttt(n=0, partition=[], canonical_label=True, base=True)
|
|
160
|
+
1
|
|
161
|
+
"""
|
|
162
|
+
cdef aut_gp_and_can_lab *output
|
|
163
|
+
cdef Integer I = Integer(0)
|
|
164
|
+
cdef PartitionStack *part
|
|
165
|
+
part = PS_from_list(partition)
|
|
166
|
+
if part is NULL:
|
|
167
|
+
raise MemoryError
|
|
168
|
+
cdef object empty_list = []
|
|
169
|
+
output = get_aut_gp_and_can_lab(<void *> empty_list, part, n, &all_children_are_equivalent_trivial, &refine_and_return_invariant_trivial, &compare_structures_trivial, canonical_label, NULL, NULL, NULL)
|
|
170
|
+
SC_order(output.group, 0, I.value)
|
|
171
|
+
print(I)
|
|
172
|
+
PS_dealloc(part)
|
|
173
|
+
deallocate_agcl_output(output)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def test_intersect_parabolic_with_alternating(int n=9, list partition=[[0,1,2],[3,4],[5,6,7,8]]):
|
|
177
|
+
"""
|
|
178
|
+
A test for nontrivial input group in computing automorphism groups.
|
|
179
|
+
|
|
180
|
+
TESTS::
|
|
181
|
+
|
|
182
|
+
sage: from sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label import test_intersect_parabolic_with_alternating as tipwa
|
|
183
|
+
sage: tipwa()
|
|
184
|
+
144
|
|
185
|
+
sage: tipwa(5, [[0],[1],[2],[3,4]])
|
|
186
|
+
1
|
|
187
|
+
sage: tipwa(5, [[0],[1],[2,3,4]])
|
|
188
|
+
3
|
|
189
|
+
sage: tipwa(5, [[0,1],[2,3,4]])
|
|
190
|
+
6
|
|
191
|
+
sage: tipwa(7, [[0,1,2,3,4,5,6]])
|
|
192
|
+
2520
|
|
193
|
+
sage: factorial(7)/2
|
|
194
|
+
2520
|
|
195
|
+
sage: tipwa(9, [[0,1,2,3],[4,5,6,7,8]])
|
|
196
|
+
1440
|
|
197
|
+
"""
|
|
198
|
+
cdef aut_gp_and_can_lab *output
|
|
199
|
+
cdef Integer I = Integer(0)
|
|
200
|
+
cdef PartitionStack *part
|
|
201
|
+
part = PS_from_list(partition)
|
|
202
|
+
if part is NULL:
|
|
203
|
+
raise MemoryError
|
|
204
|
+
cdef StabilizerChain *group = SC_alternating_group(part.degree)
|
|
205
|
+
if group is NULL:
|
|
206
|
+
PS_dealloc(part)
|
|
207
|
+
raise MemoryError
|
|
208
|
+
cdef object empty_list = []
|
|
209
|
+
output = get_aut_gp_and_can_lab(<void *> empty_list, part, n, &all_children_are_equivalent_trivial, &refine_and_return_invariant_trivial, &compare_structures_trivial, 0, group, NULL, NULL)
|
|
210
|
+
SC_order(output.group, 0, I.value)
|
|
211
|
+
print(I)
|
|
212
|
+
PS_dealloc(part)
|
|
213
|
+
SC_dealloc(group)
|
|
214
|
+
deallocate_agcl_output(output)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
cdef int compare_perms(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree) noexcept:
|
|
218
|
+
cdef list MS1 = <list> S1
|
|
219
|
+
cdef list MS2 = <list> S2
|
|
220
|
+
cdef int i, j
|
|
221
|
+
for i in range(degree):
|
|
222
|
+
j = agcl_cmp(MS1[gamma_1[i]], MS2[gamma_2[i]])
|
|
223
|
+
if j != 0:
|
|
224
|
+
return j
|
|
225
|
+
return 0
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def coset_rep(list perm=[0,1,2,3,4,5], list gens=[[1,2,3,4,5,0]]):
|
|
229
|
+
"""
|
|
230
|
+
Given a group G generated by the given generators, defines a map from the
|
|
231
|
+
Symmetric group to G so that any two elements from the same right coset go
|
|
232
|
+
to the same element. Tests nontrivial input group when computing canonical
|
|
233
|
+
labels.
|
|
234
|
+
|
|
235
|
+
TESTS::
|
|
236
|
+
|
|
237
|
+
sage: from sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label import coset_rep
|
|
238
|
+
sage: coset_rep()
|
|
239
|
+
[5, 0, 1, 2, 3, 4]
|
|
240
|
+
sage: gens = [[1,2,3,0]]
|
|
241
|
+
sage: reps = []
|
|
242
|
+
sage: for p in SymmetricGroup(4):
|
|
243
|
+
....: p = [p(i)-1 for i in range(1,5)]
|
|
244
|
+
....: r = coset_rep(p, gens)
|
|
245
|
+
....: if r not in reps:
|
|
246
|
+
....: reps.append(r)
|
|
247
|
+
sage: len(reps)
|
|
248
|
+
6
|
|
249
|
+
sage: gens = [[1,0,2,3],[0,1,3,2]]
|
|
250
|
+
sage: reps = []
|
|
251
|
+
sage: for p in SymmetricGroup(4):
|
|
252
|
+
....: p = [p(i)-1 for i in range(1,5)]
|
|
253
|
+
....: r = coset_rep(p, gens)
|
|
254
|
+
....: if r not in reps:
|
|
255
|
+
....: reps.append(r)
|
|
256
|
+
sage: len(reps)
|
|
257
|
+
6
|
|
258
|
+
sage: gens = [[1,2,0,3]]
|
|
259
|
+
sage: reps = []
|
|
260
|
+
sage: for p in SymmetricGroup(4):
|
|
261
|
+
....: p = [p(i)-1 for i in range(1,5)]
|
|
262
|
+
....: r = coset_rep(p, gens)
|
|
263
|
+
....: if r not in reps:
|
|
264
|
+
....: reps.append(r)
|
|
265
|
+
sage: len(reps)
|
|
266
|
+
8
|
|
267
|
+
"""
|
|
268
|
+
cdef int i, n = len(perm)
|
|
269
|
+
assert all(len(g) == n for g in gens)
|
|
270
|
+
cdef aut_gp_and_can_lab *output
|
|
271
|
+
cdef Integer I = Integer(0)
|
|
272
|
+
cdef PartitionStack *part
|
|
273
|
+
part = PS_new(n, 1)
|
|
274
|
+
cdef int *c_perm = <int *> sig_malloc(n * sizeof(int))
|
|
275
|
+
cdef StabilizerChain *group = SC_new(n, 1)
|
|
276
|
+
if part is NULL or c_perm is NULL or group is NULL:
|
|
277
|
+
sig_free(c_perm)
|
|
278
|
+
PS_dealloc(part)
|
|
279
|
+
SC_dealloc(group)
|
|
280
|
+
raise MemoryError
|
|
281
|
+
for g in gens:
|
|
282
|
+
for i from 0 <= i < n:
|
|
283
|
+
c_perm[i] = g[i]
|
|
284
|
+
SC_insert(group, 0, c_perm, 1)
|
|
285
|
+
output = get_aut_gp_and_can_lab(<void *> perm, part, n, &all_children_are_equivalent_trivial, &refine_and_return_invariant_trivial, &compare_perms, 1, group, NULL, NULL)
|
|
286
|
+
SC_order(output.group, 0, I.value)
|
|
287
|
+
assert I == 1
|
|
288
|
+
r_inv = list(range(n))
|
|
289
|
+
for i in range(n):
|
|
290
|
+
r_inv[output.relabeling[i]] = i
|
|
291
|
+
label = [perm[r_inv[i]] for i in range(n)]
|
|
292
|
+
PS_dealloc(part)
|
|
293
|
+
SC_dealloc(group)
|
|
294
|
+
deallocate_agcl_output(output)
|
|
295
|
+
sig_free(c_perm)
|
|
296
|
+
return label
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
cdef aut_gp_and_can_lab *allocate_agcl_output(int n) noexcept:
|
|
300
|
+
r"""
|
|
301
|
+
Allocate an instance of the aut_gp_and_can_lab struct of degree n. This can
|
|
302
|
+
be input to the get_aut_gp_and_can_lab function, and the output will be
|
|
303
|
+
stored to it.
|
|
304
|
+
"""
|
|
305
|
+
cdef aut_gp_and_can_lab *output = <aut_gp_and_can_lab *> sig_malloc(sizeof(aut_gp_and_can_lab))
|
|
306
|
+
if output is NULL:
|
|
307
|
+
return NULL
|
|
308
|
+
output.group = SC_new(n)
|
|
309
|
+
output.relabeling = <int *> sig_malloc(n*sizeof(int))
|
|
310
|
+
output.generators = <int *> sig_malloc(2*n*n*sizeof(int))
|
|
311
|
+
output.size_of_generator_array = 2*n*n
|
|
312
|
+
if output.group is NULL or \
|
|
313
|
+
output.relabeling is NULL or \
|
|
314
|
+
output.generators is NULL:
|
|
315
|
+
deallocate_agcl_output(output)
|
|
316
|
+
return NULL
|
|
317
|
+
return output
|
|
318
|
+
|
|
319
|
+
cdef void deallocate_agcl_output(aut_gp_and_can_lab *output) noexcept:
|
|
320
|
+
r"""
|
|
321
|
+
Deallocate an aut_gp_and_can_lab struct.
|
|
322
|
+
"""
|
|
323
|
+
if output is not NULL:
|
|
324
|
+
SC_dealloc(output.group)
|
|
325
|
+
sig_free(output.relabeling)
|
|
326
|
+
sig_free(output.generators)
|
|
327
|
+
sig_free(output)
|
|
328
|
+
|
|
329
|
+
cdef agcl_work_space *allocate_agcl_work_space(int n) noexcept:
|
|
330
|
+
r"""
|
|
331
|
+
Allocate work space for the get_aut_gp_and_can_lab function. It can be
|
|
332
|
+
input to the function in which case it must be deallocated after the
|
|
333
|
+
function is called.
|
|
334
|
+
"""
|
|
335
|
+
cdef int *int_array
|
|
336
|
+
|
|
337
|
+
cdef agcl_work_space *work_space
|
|
338
|
+
work_space = <agcl_work_space *> sig_malloc(sizeof(agcl_work_space))
|
|
339
|
+
if work_space is NULL:
|
|
340
|
+
return NULL
|
|
341
|
+
|
|
342
|
+
work_space.degree = n
|
|
343
|
+
int_array = <int *> sig_malloc((n*n + # for perm_stack
|
|
344
|
+
n + # for label_indicators
|
|
345
|
+
7*n # for int_array
|
|
346
|
+
)*sizeof(int))
|
|
347
|
+
work_space.group1 = SC_new(n)
|
|
348
|
+
work_space.group2 = SC_new(n)
|
|
349
|
+
work_space.label_ps = PS_new(n,0)
|
|
350
|
+
work_space.bitset_array = <bitset_t *> sig_malloc((n + 2*len_of_fp_and_mcr + 1)*sizeof(bitset_t))
|
|
351
|
+
work_space.orbits_of_subgroup = OP_new(n)
|
|
352
|
+
work_space.orbits_of_permutation = OP_new(n)
|
|
353
|
+
work_space.first_ps = PS_new(n,0)
|
|
354
|
+
|
|
355
|
+
if int_array is NULL or \
|
|
356
|
+
work_space.group1 is NULL or \
|
|
357
|
+
work_space.group2 is NULL or \
|
|
358
|
+
work_space.label_ps is NULL or \
|
|
359
|
+
work_space.bitset_array is NULL or \
|
|
360
|
+
work_space.orbits_of_subgroup is NULL or \
|
|
361
|
+
work_space.orbits_of_permutation is NULL or \
|
|
362
|
+
work_space.first_ps is NULL:
|
|
363
|
+
sig_free(work_space)
|
|
364
|
+
return NULL
|
|
365
|
+
|
|
366
|
+
work_space.perm_stack = int_array
|
|
367
|
+
work_space.label_indicators = int_array + n*n
|
|
368
|
+
work_space.int_array = int_array + n*n + n
|
|
369
|
+
|
|
370
|
+
cdef int i
|
|
371
|
+
for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
|
|
372
|
+
work_space.bitset_array[i].bits = NULL
|
|
373
|
+
try:
|
|
374
|
+
for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
|
|
375
|
+
bitset_init(work_space.bitset_array[i], n)
|
|
376
|
+
except MemoryError:
|
|
377
|
+
deallocate_agcl_work_space(work_space)
|
|
378
|
+
return NULL
|
|
379
|
+
return work_space
|
|
380
|
+
|
|
381
|
+
cdef void deallocate_agcl_work_space(agcl_work_space *work_space) noexcept:
|
|
382
|
+
r"""
|
|
383
|
+
Deallocate work space for the get_aut_gp_and_can_lab function.
|
|
384
|
+
"""
|
|
385
|
+
if work_space is NULL:
|
|
386
|
+
return
|
|
387
|
+
cdef int i, n = work_space.degree
|
|
388
|
+
if work_space.bitset_array is not NULL:
|
|
389
|
+
for i from 0 <= i < n + 2*len_of_fp_and_mcr + 1:
|
|
390
|
+
bitset_free(work_space.bitset_array[i])
|
|
391
|
+
sig_free(work_space.perm_stack)
|
|
392
|
+
SC_dealloc(work_space.group1)
|
|
393
|
+
SC_dealloc(work_space.group2)
|
|
394
|
+
PS_dealloc(work_space.label_ps)
|
|
395
|
+
sig_free(work_space.bitset_array)
|
|
396
|
+
OP_dealloc(work_space.orbits_of_subgroup)
|
|
397
|
+
OP_dealloc(work_space.orbits_of_permutation)
|
|
398
|
+
PS_dealloc(work_space.first_ps)
|
|
399
|
+
sig_free(work_space)
|
|
400
|
+
|
|
401
|
+
cdef aut_gp_and_can_lab *get_aut_gp_and_can_lab(void *S,
|
|
402
|
+
PartitionStack *partition, int n,
|
|
403
|
+
bint (*all_children_are_equivalent)(PartitionStack *PS, void *S) noexcept,
|
|
404
|
+
int (*refine_and_return_invariant)(PartitionStack *PS, void *S,
|
|
405
|
+
int *cells_to_refine_by, int ctrb_len) noexcept,
|
|
406
|
+
int (*compare_structures)(int *gamma_1, int *gamma_2, void *S1, void *S2,
|
|
407
|
+
int degree) noexcept,
|
|
408
|
+
bint canonical_label, StabilizerChain *input_group,
|
|
409
|
+
agcl_work_space *work_space_prealloc, aut_gp_and_can_lab *output_prealloc) except NULL:
|
|
410
|
+
"""
|
|
411
|
+
Traverse the search space for subgroup/canonical label calculation.
|
|
412
|
+
|
|
413
|
+
INPUT:
|
|
414
|
+
|
|
415
|
+
- ``S`` -- pointer to the structure
|
|
416
|
+
- ``partition`` -- PartitionStack representing a partition of the points
|
|
417
|
+
- ``len_partition`` -- length of the partition
|
|
418
|
+
- ``n`` -- the number of points (points are assumed to be 0,1,...,n-1)
|
|
419
|
+
- ``canonical_label`` -- whether to search for canonical label; if True, return
|
|
420
|
+
the permutation taking S to its canonical label
|
|
421
|
+
- ``all_children_are_equivalent`` -- pointer to a function
|
|
422
|
+
INPUT:
|
|
423
|
+
- ``PS`` -- pointer to a partition stack
|
|
424
|
+
- ``S`` -- pointer to the structure
|
|
425
|
+
OUTPUT:
|
|
426
|
+
bint; returns ``True`` if it can be determined that all refinements below
|
|
427
|
+
the current one will result in an equivalent discrete partition
|
|
428
|
+
- ``refine_and_return_invariant`` -- pointer to a function
|
|
429
|
+
INPUT:
|
|
430
|
+
- ``PS`` -- pointer to a partition stack
|
|
431
|
+
- ``S`` -- pointer to the structure
|
|
432
|
+
- ``alpha`` -- an array consisting of numbers, which indicate the starting
|
|
433
|
+
positions of the cells to refine against (will likely be modified)
|
|
434
|
+
OUTPUT:
|
|
435
|
+
integer; returns an invariant under application of arbitrary permutations
|
|
436
|
+
- ``compare_structures`` -- pointer to a function
|
|
437
|
+
INPUT:
|
|
438
|
+
- ``gamma_1``, ``gamma_2`` -- (list) permutations of the points of S1 and S2
|
|
439
|
+
- ``S1``, ``S2`` -- pointers to the structures
|
|
440
|
+
- ``degree`` -- degree of gamma_1 and 2
|
|
441
|
+
OUTPUT:
|
|
442
|
+
integer; 0 if gamma_1(S1) = gamma_2(S2), otherwise -1 or 1 (see docs for cmp),
|
|
443
|
+
such that the set of all structures is well-ordered
|
|
444
|
+
|
|
445
|
+
.. NOTE::
|
|
446
|
+
|
|
447
|
+
The partition ``partition1`` *must* satisfy the property that in each
|
|
448
|
+
cell, the smallest element occurs first!
|
|
449
|
+
|
|
450
|
+
OUTPUT: a pointer to a ``aut_gp_and_can_lab`` struct
|
|
451
|
+
"""
|
|
452
|
+
cdef PartitionStack *current_ps
|
|
453
|
+
cdef PartitionStack *first_ps
|
|
454
|
+
cdef PartitionStack *label_ps
|
|
455
|
+
cdef int first_meets_current = -1
|
|
456
|
+
cdef int label_meets_current
|
|
457
|
+
cdef int current_kids_are_same = 1
|
|
458
|
+
cdef int first_kids_are_same
|
|
459
|
+
|
|
460
|
+
cdef int *current_indicators
|
|
461
|
+
cdef int *first_indicators
|
|
462
|
+
cdef int *label_indicators
|
|
463
|
+
cdef int first_and_current_indicator_same
|
|
464
|
+
cdef int label_and_current_indicator_same = -1
|
|
465
|
+
cdef int compared_current_and_label_indicators
|
|
466
|
+
|
|
467
|
+
cdef OrbitPartition *orbits_of_subgroup
|
|
468
|
+
cdef OrbitPartition *orbits_of_permutation
|
|
469
|
+
cdef OrbitPartition *orbits_of_supergroup
|
|
470
|
+
cdef int subgroup_primary_orbit_size = 0
|
|
471
|
+
cdef int minimal_in_primary_orbit
|
|
472
|
+
|
|
473
|
+
cdef bitset_t *fixed_points_of_generators # i.e. fp
|
|
474
|
+
cdef bitset_t *minimal_cell_reps_of_generators # i.e. mcr
|
|
475
|
+
cdef int index_in_fp_and_mcr = -1
|
|
476
|
+
|
|
477
|
+
cdef bitset_t *vertices_to_split
|
|
478
|
+
cdef bitset_t *vertices_have_been_reduced
|
|
479
|
+
cdef int *permutation
|
|
480
|
+
cdef int *label_perm
|
|
481
|
+
cdef int *id_perm
|
|
482
|
+
cdef int *cells_to_refine_by
|
|
483
|
+
cdef int *vertices_determining_current_stack
|
|
484
|
+
cdef int *perm_stack
|
|
485
|
+
cdef StabilizerChain *group = NULL
|
|
486
|
+
cdef StabilizerChain *old_group
|
|
487
|
+
cdef StabilizerChain *tmp_gp
|
|
488
|
+
|
|
489
|
+
cdef int i, j, k, ell, b
|
|
490
|
+
cdef bint discrete, automorphism, update_label
|
|
491
|
+
cdef bint backtrack, new_vertex, mem_err = 0
|
|
492
|
+
|
|
493
|
+
cdef aut_gp_and_can_lab *output
|
|
494
|
+
cdef agcl_work_space *work_space
|
|
495
|
+
|
|
496
|
+
if output_prealloc is not NULL:
|
|
497
|
+
output = output_prealloc
|
|
498
|
+
output.group.base_size = 0
|
|
499
|
+
else:
|
|
500
|
+
output = allocate_agcl_output(n)
|
|
501
|
+
if output is NULL:
|
|
502
|
+
raise MemoryError
|
|
503
|
+
|
|
504
|
+
output.num_gens = 0
|
|
505
|
+
if n == 0:
|
|
506
|
+
return output
|
|
507
|
+
|
|
508
|
+
if work_space_prealloc is not NULL:
|
|
509
|
+
work_space = work_space_prealloc
|
|
510
|
+
else:
|
|
511
|
+
work_space = allocate_agcl_work_space(n)
|
|
512
|
+
if work_space is NULL:
|
|
513
|
+
if output_prealloc is NULL:
|
|
514
|
+
deallocate_agcl_output(output)
|
|
515
|
+
raise MemoryError
|
|
516
|
+
|
|
517
|
+
# Allocate:
|
|
518
|
+
if input_group is not NULL:
|
|
519
|
+
perm_stack = work_space.perm_stack
|
|
520
|
+
group = work_space.group1
|
|
521
|
+
old_group = work_space.group2
|
|
522
|
+
orbits_of_supergroup = input_group.OP_scratch
|
|
523
|
+
SC_copy_nomalloc(group, input_group, n)
|
|
524
|
+
SC_identify(perm_stack, n)
|
|
525
|
+
if canonical_label:
|
|
526
|
+
label_indicators = work_space.label_indicators
|
|
527
|
+
label_ps = work_space.label_ps
|
|
528
|
+
first_ps = work_space.first_ps
|
|
529
|
+
orbits_of_subgroup = work_space.orbits_of_subgroup
|
|
530
|
+
orbits_of_permutation = work_space.orbits_of_permutation
|
|
531
|
+
|
|
532
|
+
current_indicators = work_space.int_array
|
|
533
|
+
first_indicators = work_space.int_array + n
|
|
534
|
+
permutation = work_space.int_array + 2 * n
|
|
535
|
+
id_perm = work_space.int_array + 3 * n
|
|
536
|
+
cells_to_refine_by = work_space.int_array + 4 * n
|
|
537
|
+
vertices_determining_current_stack = work_space.int_array + 5 * n
|
|
538
|
+
label_perm = work_space.int_array + 6 * n
|
|
539
|
+
|
|
540
|
+
fixed_points_of_generators = work_space.bitset_array
|
|
541
|
+
minimal_cell_reps_of_generators = work_space.bitset_array + len_of_fp_and_mcr
|
|
542
|
+
vertices_to_split = work_space.bitset_array + 2*len_of_fp_and_mcr
|
|
543
|
+
vertices_have_been_reduced = work_space.bitset_array + 2*len_of_fp_and_mcr + n
|
|
544
|
+
|
|
545
|
+
if work_space_prealloc is not NULL:
|
|
546
|
+
OP_clear(orbits_of_subgroup)
|
|
547
|
+
|
|
548
|
+
bitset_zero(vertices_have_been_reduced[0])
|
|
549
|
+
current_ps = partition
|
|
550
|
+
current_ps.depth = 0
|
|
551
|
+
|
|
552
|
+
# default values of "infinity"
|
|
553
|
+
for i from 0 <= i < n:
|
|
554
|
+
first_indicators[i] = -1
|
|
555
|
+
if canonical_label:
|
|
556
|
+
for i from 0 <= i < n:
|
|
557
|
+
label_indicators[i] = -1
|
|
558
|
+
|
|
559
|
+
# set up the identity permutation
|
|
560
|
+
for i from 0 <= i < n:
|
|
561
|
+
id_perm[i] = i
|
|
562
|
+
|
|
563
|
+
# Our first refinement needs to check every cell of the partition,
|
|
564
|
+
# so cells_to_refine_by needs to be a list of pointers to each cell.
|
|
565
|
+
j = 1
|
|
566
|
+
cells_to_refine_by[0] = 0
|
|
567
|
+
for i from 0 < i < n:
|
|
568
|
+
if current_ps.levels[i-1] == 0:
|
|
569
|
+
cells_to_refine_by[j] = i
|
|
570
|
+
j += 1
|
|
571
|
+
# Ignore the invariant this time, since we are
|
|
572
|
+
# creating the root of the search tree.
|
|
573
|
+
if input_group is NULL:
|
|
574
|
+
refine_and_return_invariant(current_ps, S, cells_to_refine_by, j)
|
|
575
|
+
else:
|
|
576
|
+
refine_also_by_orbits(current_ps, S, refine_and_return_invariant,
|
|
577
|
+
cells_to_refine_by, j, group, perm_stack)
|
|
578
|
+
PS_move_all_mins_to_front(current_ps)
|
|
579
|
+
|
|
580
|
+
# Refine down to a discrete partition
|
|
581
|
+
while not PS_is_discrete(current_ps):
|
|
582
|
+
i = current_ps.depth
|
|
583
|
+
if not all_children_are_equivalent(current_ps, S):
|
|
584
|
+
current_kids_are_same = i + 1
|
|
585
|
+
vertices_determining_current_stack[i] = PS_first_smallest(current_ps, vertices_to_split[i])
|
|
586
|
+
bitset_unset(vertices_have_been_reduced[0], i)
|
|
587
|
+
if input_group is not NULL:
|
|
588
|
+
OP_clear(orbits_of_supergroup)
|
|
589
|
+
for j from i <= j < group.base_size:
|
|
590
|
+
for ell from 0 <= ell < group.num_gens[j]:
|
|
591
|
+
OP_merge_list_perm(orbits_of_supergroup, group.generators[j] + n*ell)
|
|
592
|
+
b = orbits_of_supergroup.mcr[OP_find(orbits_of_supergroup, perm_stack[i*n + vertices_determining_current_stack[i]])]
|
|
593
|
+
tmp_gp = group
|
|
594
|
+
group = old_group
|
|
595
|
+
old_group = tmp_gp
|
|
596
|
+
if SC_insert_base_point_nomalloc(group, old_group, i, b):
|
|
597
|
+
mem_err = 1
|
|
598
|
+
break
|
|
599
|
+
current_indicators[i] = split_point_and_refine_by_orbits(current_ps,
|
|
600
|
+
vertices_determining_current_stack[i], S, refine_and_return_invariant,
|
|
601
|
+
cells_to_refine_by, group, perm_stack)
|
|
602
|
+
else:
|
|
603
|
+
current_indicators[i] = split_point_and_refine(current_ps, vertices_determining_current_stack[i], S, refine_and_return_invariant, cells_to_refine_by)
|
|
604
|
+
PS_move_all_mins_to_front(current_ps)
|
|
605
|
+
first_indicators[i] = current_indicators[i]
|
|
606
|
+
if canonical_label:
|
|
607
|
+
label_indicators[i] = current_indicators[i]
|
|
608
|
+
SC_add_base_point(output.group, vertices_determining_current_stack[i])
|
|
609
|
+
|
|
610
|
+
if not mem_err:
|
|
611
|
+
first_meets_current = current_ps.depth
|
|
612
|
+
first_kids_are_same = current_ps.depth
|
|
613
|
+
first_and_current_indicator_same = current_ps.depth
|
|
614
|
+
PS_copy_from_to(current_ps, first_ps)
|
|
615
|
+
if canonical_label:
|
|
616
|
+
label_meets_current = current_ps.depth
|
|
617
|
+
label_and_current_indicator_same = current_ps.depth
|
|
618
|
+
compared_current_and_label_indicators = 0
|
|
619
|
+
PS_copy_from_to(current_ps, label_ps)
|
|
620
|
+
if input_group is not NULL:
|
|
621
|
+
if compute_relabeling(group, old_group, label_ps.entries, label_perm):
|
|
622
|
+
mem_err = 1
|
|
623
|
+
current_ps.depth -= 1
|
|
624
|
+
|
|
625
|
+
# Main loop:
|
|
626
|
+
while current_ps.depth != -1:
|
|
627
|
+
|
|
628
|
+
if mem_err:
|
|
629
|
+
if output_prealloc is NULL:
|
|
630
|
+
deallocate_agcl_output(output)
|
|
631
|
+
if work_space_prealloc is NULL:
|
|
632
|
+
deallocate_agcl_work_space(work_space_prealloc)
|
|
633
|
+
raise MemoryError
|
|
634
|
+
|
|
635
|
+
# If necessary, update label_meets_current
|
|
636
|
+
if canonical_label and label_meets_current > current_ps.depth:
|
|
637
|
+
label_meets_current = current_ps.depth
|
|
638
|
+
|
|
639
|
+
# I. Search for a new vertex to split, and update subgroup information
|
|
640
|
+
new_vertex = 0
|
|
641
|
+
if current_ps.depth > first_meets_current:
|
|
642
|
+
# If we are not at a node of the first stack, reduce size of
|
|
643
|
+
# vertices_to_split by using the symmetries we already know.
|
|
644
|
+
if not bitset_check(vertices_have_been_reduced[0], current_ps.depth):
|
|
645
|
+
for i from 0 <= i <= index_in_fp_and_mcr:
|
|
646
|
+
j = 0
|
|
647
|
+
while j < current_ps.depth and bitset_check(fixed_points_of_generators[i], vertices_determining_current_stack[j]):
|
|
648
|
+
j += 1
|
|
649
|
+
# If each vertex split so far is fixed by generator i,
|
|
650
|
+
# then remove elements of vertices_to_split which are
|
|
651
|
+
# not minimal in their orbits under generator i.
|
|
652
|
+
if j == current_ps.depth:
|
|
653
|
+
for k from 0 <= k < n:
|
|
654
|
+
if bitset_check(vertices_to_split[current_ps.depth], k) and not bitset_check(minimal_cell_reps_of_generators[i], k):
|
|
655
|
+
bitset_flip(vertices_to_split[current_ps.depth], k)
|
|
656
|
+
bitset_flip(vertices_have_been_reduced[0], current_ps.depth)
|
|
657
|
+
# Look for a new point to split.
|
|
658
|
+
i = vertices_determining_current_stack[current_ps.depth] + 1
|
|
659
|
+
i = bitset_next(vertices_to_split[current_ps.depth], i)
|
|
660
|
+
if i != -1:
|
|
661
|
+
# There is a new point.
|
|
662
|
+
vertices_determining_current_stack[current_ps.depth] = i
|
|
663
|
+
new_vertex = 1
|
|
664
|
+
else:
|
|
665
|
+
# No new point: backtrack.
|
|
666
|
+
current_ps.depth -= 1
|
|
667
|
+
else:
|
|
668
|
+
# If we are at a node of the first stack, the above reduction
|
|
669
|
+
# will not help. Also, we must update information about
|
|
670
|
+
# primary orbits here.
|
|
671
|
+
if current_ps.depth < first_meets_current:
|
|
672
|
+
# If we are done searching under this part of the first
|
|
673
|
+
# stack, then first_meets_current is one higher, and we
|
|
674
|
+
# are looking at a new primary orbit (corresponding to a
|
|
675
|
+
# larger subgroup in the stabilizer chain).
|
|
676
|
+
first_meets_current = current_ps.depth
|
|
677
|
+
minimal_in_primary_orbit = output.group.base_orbits[current_ps.depth][0]
|
|
678
|
+
while True:
|
|
679
|
+
i = vertices_determining_current_stack[current_ps.depth]
|
|
680
|
+
# This was the last point to be split here.
|
|
681
|
+
# If it has been added to the primary orbit, update size info.
|
|
682
|
+
if output.group.parents[current_ps.depth][i] != -1:
|
|
683
|
+
subgroup_primary_orbit_size += 1
|
|
684
|
+
# Look for a new point to split.
|
|
685
|
+
i += 1
|
|
686
|
+
i = bitset_next(vertices_to_split[current_ps.depth], i)
|
|
687
|
+
if i != -1:
|
|
688
|
+
# There is a new point.
|
|
689
|
+
vertices_determining_current_stack[current_ps.depth] = i
|
|
690
|
+
if orbits_of_subgroup.mcr[OP_find(orbits_of_subgroup, i)] == i:
|
|
691
|
+
new_vertex = 1
|
|
692
|
+
break
|
|
693
|
+
else:
|
|
694
|
+
# No new point: backtrack.
|
|
695
|
+
# Note that now, we are backtracking up the first stack.
|
|
696
|
+
vertices_determining_current_stack[current_ps.depth] = -1
|
|
697
|
+
# If every choice of point to split gave something in the
|
|
698
|
+
# (same!) primary orbit, then all children of the first
|
|
699
|
+
# stack at this point are equivalent.
|
|
700
|
+
j = 0
|
|
701
|
+
for i from 0 <= i < n:
|
|
702
|
+
if bitset_check(vertices_to_split[current_ps.depth], i):
|
|
703
|
+
j += 1
|
|
704
|
+
if j == subgroup_primary_orbit_size and first_kids_are_same == current_ps.depth+1:
|
|
705
|
+
first_kids_are_same = current_ps.depth
|
|
706
|
+
subgroup_primary_orbit_size = 0
|
|
707
|
+
current_ps.depth -= 1
|
|
708
|
+
break
|
|
709
|
+
if not new_vertex:
|
|
710
|
+
continue
|
|
711
|
+
|
|
712
|
+
if current_kids_are_same > current_ps.depth + 1:
|
|
713
|
+
current_kids_are_same = current_ps.depth + 1
|
|
714
|
+
if first_and_current_indicator_same > current_ps.depth:
|
|
715
|
+
first_and_current_indicator_same = current_ps.depth
|
|
716
|
+
if canonical_label and label_and_current_indicator_same >= current_ps.depth:
|
|
717
|
+
label_and_current_indicator_same = current_ps.depth
|
|
718
|
+
compared_current_and_label_indicators = 0
|
|
719
|
+
|
|
720
|
+
# II. Refine down to a discrete partition, or until
|
|
721
|
+
# we leave the part of the tree we are interested in
|
|
722
|
+
discrete = 0
|
|
723
|
+
backtrack = 0
|
|
724
|
+
while True:
|
|
725
|
+
i = current_ps.depth
|
|
726
|
+
if input_group is not NULL:
|
|
727
|
+
current_indicators[i] = split_point_and_refine_by_orbits(current_ps,
|
|
728
|
+
vertices_determining_current_stack[i], S,
|
|
729
|
+
refine_and_return_invariant, cells_to_refine_by,
|
|
730
|
+
group, perm_stack)
|
|
731
|
+
else:
|
|
732
|
+
current_indicators[i] = split_point_and_refine(current_ps,
|
|
733
|
+
vertices_determining_current_stack[i], S,
|
|
734
|
+
refine_and_return_invariant, cells_to_refine_by)
|
|
735
|
+
PS_move_all_mins_to_front(current_ps)
|
|
736
|
+
if first_and_current_indicator_same == i and \
|
|
737
|
+
current_indicators[i] == first_indicators[i] and \
|
|
738
|
+
stacks_are_equivalent(first_ps, current_ps):
|
|
739
|
+
first_and_current_indicator_same += 1
|
|
740
|
+
if canonical_label:
|
|
741
|
+
if compared_current_and_label_indicators == 0:
|
|
742
|
+
if label_indicators[i] == -1:
|
|
743
|
+
compared_current_and_label_indicators = -1
|
|
744
|
+
else:
|
|
745
|
+
compared_current_and_label_indicators = agcl_cmp(current_indicators[i], label_indicators[i])
|
|
746
|
+
if label_and_current_indicator_same == i and compared_current_and_label_indicators == 0:
|
|
747
|
+
label_and_current_indicator_same += 1
|
|
748
|
+
if compared_current_and_label_indicators > 0:
|
|
749
|
+
label_indicators[i] = current_indicators[i]
|
|
750
|
+
if first_and_current_indicator_same < current_ps.depth and (not canonical_label or compared_current_and_label_indicators < 0):
|
|
751
|
+
backtrack = 1
|
|
752
|
+
break
|
|
753
|
+
if PS_is_discrete(current_ps):
|
|
754
|
+
discrete = 1
|
|
755
|
+
break
|
|
756
|
+
vertices_determining_current_stack[current_ps.depth] = PS_first_smallest(current_ps, vertices_to_split[current_ps.depth])
|
|
757
|
+
if input_group is not NULL:
|
|
758
|
+
i = current_ps.depth
|
|
759
|
+
k = vertices_determining_current_stack[i]
|
|
760
|
+
if group.parents[i][perm_stack[n*i + k]] == -1:
|
|
761
|
+
# if we get here then canonical_label must be true
|
|
762
|
+
# and we have to make a change of base
|
|
763
|
+
OP_clear(orbits_of_supergroup)
|
|
764
|
+
for j from i <= j < group.base_size:
|
|
765
|
+
for ell from 0 <= ell < group.num_gens[j]:
|
|
766
|
+
OP_merge_list_perm(orbits_of_supergroup, group.generators[j] + n*ell)
|
|
767
|
+
b = orbits_of_supergroup.mcr[OP_find(orbits_of_supergroup, perm_stack[i*n + k])]
|
|
768
|
+
tmp_gp = group
|
|
769
|
+
group = old_group
|
|
770
|
+
old_group = tmp_gp
|
|
771
|
+
if SC_insert_base_point_nomalloc(group, old_group, i, b):
|
|
772
|
+
mem_err = 1
|
|
773
|
+
break
|
|
774
|
+
bitset_unset(vertices_have_been_reduced[0], current_ps.depth)
|
|
775
|
+
if not all_children_are_equivalent(current_ps, S):
|
|
776
|
+
current_kids_are_same = current_ps.depth + 1
|
|
777
|
+
|
|
778
|
+
# III. Check for automorphisms and labels
|
|
779
|
+
automorphism = 0
|
|
780
|
+
if discrete:
|
|
781
|
+
if current_ps.depth == first_and_current_indicator_same:
|
|
782
|
+
PS_get_perm_from(current_ps, first_ps, permutation)
|
|
783
|
+
if compare_structures(permutation, id_perm, S, S, n) == 0:
|
|
784
|
+
if input_group is NULL or SC_contains(group, 0, permutation, 0):
|
|
785
|
+
# TODO: might be slight optimization for containment using perm_stack
|
|
786
|
+
automorphism = 1
|
|
787
|
+
if not automorphism:
|
|
788
|
+
if (not canonical_label) or (compared_current_and_label_indicators < 0):
|
|
789
|
+
backtrack = 1
|
|
790
|
+
else:
|
|
791
|
+
# if we get here, discrete must be true
|
|
792
|
+
update_label = 0
|
|
793
|
+
if (compared_current_and_label_indicators > 0) or (current_ps.depth < label_ps.depth):
|
|
794
|
+
if input_group is not NULL:
|
|
795
|
+
if compute_relabeling(group, old_group, current_ps.entries, permutation):
|
|
796
|
+
mem_err = 1
|
|
797
|
+
break
|
|
798
|
+
update_label = 1
|
|
799
|
+
else:
|
|
800
|
+
if input_group is NULL:
|
|
801
|
+
i = compare_structures(current_ps.entries, label_ps.entries, S, S, n)
|
|
802
|
+
else:
|
|
803
|
+
if compute_relabeling(group, old_group, current_ps.entries, permutation):
|
|
804
|
+
mem_err = 1
|
|
805
|
+
break
|
|
806
|
+
i = compare_structures(permutation, label_perm, S, S, n)
|
|
807
|
+
if i > 0:
|
|
808
|
+
update_label = 1
|
|
809
|
+
elif i < 0:
|
|
810
|
+
backtrack = 1
|
|
811
|
+
else:
|
|
812
|
+
if input_group is NULL:
|
|
813
|
+
PS_get_perm_from(current_ps, label_ps, permutation)
|
|
814
|
+
automorphism = 1
|
|
815
|
+
elif memcmp(permutation, label_perm, n*sizeof(int)):
|
|
816
|
+
SC_invert_perm(group.perm_scratch, permutation, n)
|
|
817
|
+
SC_mult_perms(permutation, group.perm_scratch, label_perm, n)
|
|
818
|
+
automorphism = 1
|
|
819
|
+
else:
|
|
820
|
+
backtrack = 1
|
|
821
|
+
if update_label:
|
|
822
|
+
PS_copy_from_to(current_ps, label_ps)
|
|
823
|
+
if input_group is not NULL:
|
|
824
|
+
memcpy(label_perm, permutation, n*sizeof(int))
|
|
825
|
+
compared_current_and_label_indicators = 0
|
|
826
|
+
label_meets_current = current_ps.depth
|
|
827
|
+
label_and_current_indicator_same = current_ps.depth
|
|
828
|
+
label_indicators[current_ps.depth] = -1
|
|
829
|
+
backtrack = 1
|
|
830
|
+
if automorphism:
|
|
831
|
+
if index_in_fp_and_mcr < len_of_fp_and_mcr - 1:
|
|
832
|
+
index_in_fp_and_mcr += 1
|
|
833
|
+
bitset_zero(fixed_points_of_generators[index_in_fp_and_mcr])
|
|
834
|
+
bitset_zero(minimal_cell_reps_of_generators[index_in_fp_and_mcr])
|
|
835
|
+
OP_clear(orbits_of_permutation)
|
|
836
|
+
for i from 0 <= i < n:
|
|
837
|
+
OP_join(orbits_of_permutation, i, permutation[i])
|
|
838
|
+
bitset_zero(minimal_cell_reps_of_generators[index_in_fp_and_mcr])
|
|
839
|
+
for i from 0 <= i < n:
|
|
840
|
+
if permutation[i] == i:
|
|
841
|
+
bitset_set(fixed_points_of_generators[index_in_fp_and_mcr], i)
|
|
842
|
+
bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], i)
|
|
843
|
+
else:
|
|
844
|
+
bitset_unset(fixed_points_of_generators[index_in_fp_and_mcr], i)
|
|
845
|
+
if orbits_of_permutation.parent[i] == i:
|
|
846
|
+
bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], orbits_of_permutation.mcr[i])
|
|
847
|
+
if OP_merge_list_perm(orbits_of_subgroup, permutation): # if permutation made orbits coarser
|
|
848
|
+
# add permutation as a generator of the automorphism group
|
|
849
|
+
if n*output.num_gens == output.size_of_generator_array:
|
|
850
|
+
# must double its size
|
|
851
|
+
output.size_of_generator_array *= 2
|
|
852
|
+
output.generators = <int *> sig_realloc( output.generators, output.size_of_generator_array * sizeof(int) )
|
|
853
|
+
if output.generators is NULL:
|
|
854
|
+
mem_err = True
|
|
855
|
+
continue # main loop
|
|
856
|
+
j = n*output.num_gens
|
|
857
|
+
for i from 0 <= i < n:
|
|
858
|
+
output.generators[j + i] = permutation[i]
|
|
859
|
+
output.num_gens += 1
|
|
860
|
+
if SC_update_tree(output.group, first_meets_current, permutation, 1):
|
|
861
|
+
mem_err = 1
|
|
862
|
+
continue # main loop
|
|
863
|
+
if orbits_of_subgroup.mcr[OP_find(orbits_of_subgroup, minimal_in_primary_orbit)] != minimal_in_primary_orbit:
|
|
864
|
+
current_ps.depth = first_meets_current
|
|
865
|
+
continue # main loop
|
|
866
|
+
if canonical_label:
|
|
867
|
+
current_ps.depth = label_meets_current
|
|
868
|
+
else:
|
|
869
|
+
current_ps.depth = first_meets_current
|
|
870
|
+
if bitset_check(vertices_have_been_reduced[0], current_ps.depth):
|
|
871
|
+
bitset_and(vertices_to_split[current_ps.depth], vertices_to_split[current_ps.depth], minimal_cell_reps_of_generators[index_in_fp_and_mcr])
|
|
872
|
+
continue # main loop
|
|
873
|
+
if backtrack:
|
|
874
|
+
i = current_ps.depth
|
|
875
|
+
current_ps.depth = min(max(first_kids_are_same - 1, label_and_current_indicator_same), current_kids_are_same - 1)
|
|
876
|
+
if i == current_kids_are_same:
|
|
877
|
+
continue # main loop
|
|
878
|
+
if index_in_fp_and_mcr < len_of_fp_and_mcr - 1:
|
|
879
|
+
index_in_fp_and_mcr += 1
|
|
880
|
+
bitset_zero(fixed_points_of_generators[index_in_fp_and_mcr])
|
|
881
|
+
bitset_zero(minimal_cell_reps_of_generators[index_in_fp_and_mcr])
|
|
882
|
+
j = current_ps.depth
|
|
883
|
+
current_ps.depth = i # just for mcr and fixed functions...
|
|
884
|
+
for i from 0 <= i < n:
|
|
885
|
+
if PS_is_mcr(current_ps, i):
|
|
886
|
+
bitset_set(minimal_cell_reps_of_generators[index_in_fp_and_mcr], i)
|
|
887
|
+
if PS_is_fixed(current_ps, i):
|
|
888
|
+
bitset_set(fixed_points_of_generators[index_in_fp_and_mcr], i)
|
|
889
|
+
current_ps.depth = j
|
|
890
|
+
if bitset_check(vertices_have_been_reduced[0], current_ps.depth):
|
|
891
|
+
bitset_and(vertices_to_split[current_ps.depth], vertices_to_split[current_ps.depth], minimal_cell_reps_of_generators[index_in_fp_and_mcr])
|
|
892
|
+
|
|
893
|
+
# End of main loop.
|
|
894
|
+
|
|
895
|
+
if canonical_label:
|
|
896
|
+
if input_group is NULL:
|
|
897
|
+
for i from 0 <= i < n:
|
|
898
|
+
output.relabeling[label_ps.entries[i]] = i
|
|
899
|
+
else:
|
|
900
|
+
for i from 0 <= i < n:
|
|
901
|
+
output.relabeling[label_perm[i]] = i
|
|
902
|
+
|
|
903
|
+
if work_space_prealloc is NULL:
|
|
904
|
+
deallocate_agcl_work_space(work_space)
|
|
905
|
+
|
|
906
|
+
return output
|