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
|
Binary file
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Declaration file for canonical augmentation
|
|
4
|
+
|
|
5
|
+
AUTHORS:
|
|
6
|
+
|
|
7
|
+
- Robert Miller (2011--2013): initial version
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
#*****************************************************************************
|
|
11
|
+
# Copyright (C) 2006 - 2011 Robert L. Miller <rlmillster@gmail.com>
|
|
12
|
+
#
|
|
13
|
+
# This program is free software: you can redistribute it and/or modify
|
|
14
|
+
# it under the terms of the GNU General Public License as published by
|
|
15
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
16
|
+
# (at your option) any later version.
|
|
17
|
+
# http://www.gnu.org/licenses/
|
|
18
|
+
#*****************************************************************************
|
|
19
|
+
|
|
20
|
+
from sage.groups.perm_gps.partn_ref.data_structures cimport *
|
|
21
|
+
|
|
22
|
+
from sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label cimport (
|
|
23
|
+
get_aut_gp_and_can_lab, aut_gp_and_can_lab, agcl_work_space,
|
|
24
|
+
allocate_agcl_output, deallocate_agcl_output,
|
|
25
|
+
allocate_agcl_work_space, deallocate_agcl_work_space)
|
|
26
|
+
from sage.groups.perm_gps.partn_ref.double_coset cimport (double_coset,
|
|
27
|
+
dc_work_space, allocate_dc_work_space, deallocate_dc_work_space)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
cdef struct iterator:
|
|
31
|
+
void *data
|
|
32
|
+
void *(*next)(void *data, int *degree, bint *mem_err) noexcept
|
|
33
|
+
|
|
34
|
+
cdef struct canonical_generator_data:
|
|
35
|
+
StabilizerChain *group
|
|
36
|
+
|
|
37
|
+
void **object_stack
|
|
38
|
+
int *degree_stack
|
|
39
|
+
iterator *iterator_stack
|
|
40
|
+
aut_gp_and_can_lab **aut_gp_stack
|
|
41
|
+
agcl_work_space **agcl_work_spaces
|
|
42
|
+
dc_work_space **dc_work_spaces
|
|
43
|
+
PartitionStack **ps_stack
|
|
44
|
+
void **aug_stack
|
|
45
|
+
void **parent_stack
|
|
46
|
+
|
|
47
|
+
int level
|
|
48
|
+
int max_level
|
|
49
|
+
int allocd_levels
|
|
50
|
+
bint reduce_children
|
|
51
|
+
bint mem_err
|
|
52
|
+
bint dealloc
|
|
53
|
+
bint pr
|
|
54
|
+
|
|
55
|
+
bint (*all_children_are_equivalent)(PartitionStack *, void *) noexcept
|
|
56
|
+
int (*refine_and_return_invariant)(PartitionStack *, void *, int *, int) noexcept
|
|
57
|
+
int (*compare_structures)(int *, int *, void *, void *, int) noexcept
|
|
58
|
+
|
|
59
|
+
int (*generate_children)(void *, aut_gp_and_can_lab *, iterator *) noexcept
|
|
60
|
+
void *(*apply_augmentation)(void *, void *, void *, int *, bint *) noexcept
|
|
61
|
+
void (*free_object)(void *) noexcept
|
|
62
|
+
void (* free_iter_data)(void *) noexcept
|
|
63
|
+
void (*free_aug)(void *) noexcept
|
|
64
|
+
void *(*canonical_parent)(void *child, void *parent, int *permutation, int *degree, bint *) noexcept
|
|
65
|
+
|
|
66
|
+
cdef canonical_generator_data *allocate_cgd(int, int) noexcept
|
|
67
|
+
|
|
68
|
+
cdef void deallocate_cgd(canonical_generator_data *) noexcept
|
|
69
|
+
|
|
70
|
+
cdef void *canonical_generator_next(void *, int *, bint *) noexcept
|
|
71
|
+
|
|
72
|
+
cdef iterator *setup_canonical_generator(int degree,
|
|
73
|
+
bint (*all_children_are_equivalent)(PartitionStack *, void *) noexcept,
|
|
74
|
+
int (*refine_and_return_invariant)(PartitionStack *, void *, int *, int) noexcept,
|
|
75
|
+
int (*compare_structures)(int *, int *, void *, void *, int) noexcept,
|
|
76
|
+
int (*generate_children)(void *, aut_gp_and_can_lab *, iterator *) noexcept,
|
|
77
|
+
void *(*apply_augmentation)(void *, void *, void *, int *, bint *) noexcept,
|
|
78
|
+
void (*free_object)(void *) noexcept,
|
|
79
|
+
void (* free_iter_data)(void *) noexcept,
|
|
80
|
+
void (*free_aug)(void *) noexcept,
|
|
81
|
+
void *(*canonical_parent)(void *, void *, int *, int *, bint *) noexcept,
|
|
82
|
+
int max_depth, bint reduce_children,
|
|
83
|
+
iterator *cangen_prealloc) except NULL
|
|
84
|
+
|
|
85
|
+
cdef iterator *start_canonical_generator(StabilizerChain *, void *, int, iterator *) except NULL
|
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Canonical augmentation
|
|
4
|
+
|
|
5
|
+
This module implements a general algorithm for generating isomorphism classes
|
|
6
|
+
of objects. The class of objects in question must be some kind of structure
|
|
7
|
+
which can be built up out of smaller objects by a process of augmentation,
|
|
8
|
+
and for which an automorphism is a permutation in `S_n` for some `n`. This
|
|
9
|
+
process consists of starting with a finite number of "seed objects" and
|
|
10
|
+
building up to more complicated objects by a sequence of "augmentations." It
|
|
11
|
+
should be noted that the word "canonical" in the term canonical augmentation
|
|
12
|
+
is used loosely. Given an object `X`, one must define a canonical parent
|
|
13
|
+
`M(X)`, which is essentially an arbitrary choice.
|
|
14
|
+
|
|
15
|
+
The class of objects in question must satisfy the assumptions made in the
|
|
16
|
+
module ``automorphism_group_canonical_label``, in particular the three
|
|
17
|
+
custom functions mentioned there must be implemented:
|
|
18
|
+
|
|
19
|
+
A. ``refine_and_return_invariant``:
|
|
20
|
+
|
|
21
|
+
Signature:
|
|
22
|
+
|
|
23
|
+
``int refine_and_return_invariant(PartitionStack *PS, void *S, int *cells_to_refine_by, int ctrb_len)``
|
|
24
|
+
|
|
25
|
+
B. ``compare_structures``:
|
|
26
|
+
|
|
27
|
+
Signature:
|
|
28
|
+
|
|
29
|
+
``int compare_structures(int *gamma_1, int *gamma_2, void *S1, void *S2, int degree)``
|
|
30
|
+
|
|
31
|
+
C. ``all_children_are_equivalent``:
|
|
32
|
+
|
|
33
|
+
Signature:
|
|
34
|
+
|
|
35
|
+
``bint all_children_are_equivalent(PartitionStack *PS, void *S)``
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
In the following functions there is frequently a mem_err input. This is a
|
|
39
|
+
pointer to an integer which must be set to a nonzero value in case of an
|
|
40
|
+
allocation failure. Other functions have an int return value which serves the
|
|
41
|
+
same purpose. The idea is that if a memory error occurs, the canonical
|
|
42
|
+
generator should still be able to iterate over the objects already generated
|
|
43
|
+
before it terminates.
|
|
44
|
+
|
|
45
|
+
More details about these functions can be found in that module. In addition,
|
|
46
|
+
several other functions must be implemented, which will make use of the
|
|
47
|
+
following::
|
|
48
|
+
|
|
49
|
+
ctypedef struct iterator:
|
|
50
|
+
void *data
|
|
51
|
+
void *(*next)(void *data, int *degree, int *mem_err)
|
|
52
|
+
|
|
53
|
+
The following functions must be implemented for each specific type of object to
|
|
54
|
+
be generated. Each function following which takes a ``mem_err`` variable as
|
|
55
|
+
input should make use of this variable.
|
|
56
|
+
|
|
57
|
+
D. ``generate_children``:
|
|
58
|
+
|
|
59
|
+
Signature:
|
|
60
|
+
|
|
61
|
+
``int generate_children(void *S, aut_gp_and_can_lab *group, iterator *it)``
|
|
62
|
+
|
|
63
|
+
This function receives a pointer to an iterator ``it``. The iterator
|
|
64
|
+
has two fields: ``data`` and ``next``. The function ``generate_children``
|
|
65
|
+
should set these two fields, returning 1 to indicate a memory error, or 0
|
|
66
|
+
for no error.
|
|
67
|
+
|
|
68
|
+
The function that ``next`` points to takes ``data`` as an argument, and
|
|
69
|
+
should return a (``void *``) pointer to the next object to be iterated. It
|
|
70
|
+
also takes a pointer to an int, and must update that int to reflect the
|
|
71
|
+
degree of each generated object. The objects to be iterated over should
|
|
72
|
+
satisfy the property that if `\gamma` is an automorphism of the parent
|
|
73
|
+
object `S`, then for any two child objects `C_1, C_2` given by the iterator,
|
|
74
|
+
it is not the case that `\gamma(C_1) = C_2`, where in the latter `\gamma` is
|
|
75
|
+
appropriately extended if necessary to operate on `C_1` and `C_2`. It is
|
|
76
|
+
essential for this iterator to handle its own ``data``. If the ``next``
|
|
77
|
+
function is called and no suitable object is yielded, a NULL pointer
|
|
78
|
+
indicates a termination of the iteration. At this point, the data pointed to
|
|
79
|
+
by the ``data`` variable should be cleared by the ``next`` function, because
|
|
80
|
+
the iterator struct itself will be deallocated.
|
|
81
|
+
|
|
82
|
+
The ``next`` function must check ``mem_err[0]`` before proceeding. If it is
|
|
83
|
+
nonzero then the function should deallocate the iterator right away and
|
|
84
|
+
return NULL to end the iteration. This ensures that the canonical
|
|
85
|
+
augmentation software will finish iterating over the objects found before
|
|
86
|
+
finishing, and the ``mem_err`` attribute of the ``canonical_generator_data``
|
|
87
|
+
will reflect this.
|
|
88
|
+
|
|
89
|
+
The objects which the iterator generates can be thought of as augmentations,
|
|
90
|
+
which the following function must turn into objects.
|
|
91
|
+
|
|
92
|
+
E. ``apply_augmentation``:
|
|
93
|
+
|
|
94
|
+
Signature:
|
|
95
|
+
|
|
96
|
+
``void *apply_augmentation(void *parent, void *aug, void *child, int *degree, bint *mem_err)``
|
|
97
|
+
|
|
98
|
+
This function takes the ``parent``, applies the augmentation ``aug`` and
|
|
99
|
+
returns a pointer to the corresponding child object (freeing aug if
|
|
100
|
+
necessary). Should also update degree[0] to be the degree of the new child.
|
|
101
|
+
|
|
102
|
+
F. ``free_object``:
|
|
103
|
+
|
|
104
|
+
Signature:
|
|
105
|
+
|
|
106
|
+
``void free_object(void *child)``
|
|
107
|
+
|
|
108
|
+
This function is a simple deallocation function for children which are not
|
|
109
|
+
canonically generated, and therefore rejected in the canonical augmentation
|
|
110
|
+
process. They should deallocate the contents of ``child``.
|
|
111
|
+
|
|
112
|
+
G. ``free_iter_data``:
|
|
113
|
+
|
|
114
|
+
Signature:
|
|
115
|
+
|
|
116
|
+
``void free_iter_data(void *data)``
|
|
117
|
+
|
|
118
|
+
This function deallocates the data part of the iterator which is set up by
|
|
119
|
+
``generate_children``.
|
|
120
|
+
|
|
121
|
+
H. ``free_aug``:
|
|
122
|
+
|
|
123
|
+
Signature:
|
|
124
|
+
|
|
125
|
+
``void free_aug(void *aug)``
|
|
126
|
+
|
|
127
|
+
This function frees an augmentation as generated by the iterator returned
|
|
128
|
+
by ``generate_children``.
|
|
129
|
+
|
|
130
|
+
I. ``canonical_parent``:
|
|
131
|
+
|
|
132
|
+
Signature:
|
|
133
|
+
|
|
134
|
+
``void *canonical_parent(void *child, void *parent, int *permutation, int *degree, bint *mem_err)``
|
|
135
|
+
|
|
136
|
+
Apply the ``permutation`` to the ``child``, determine an arbitrary but fixed
|
|
137
|
+
parent, apply the inverse of ``permutation`` to that parent, and return the
|
|
138
|
+
resulting object. Must also set the integer ``degree`` points to the
|
|
139
|
+
degree of the returned object.
|
|
140
|
+
|
|
141
|
+
.. NOTE::
|
|
142
|
+
|
|
143
|
+
It is a good idea to try to implement an augmentation scheme where the
|
|
144
|
+
degree of objects on each level of the augmentation tree is constant. The
|
|
145
|
+
iteration will be more efficient in this case, as the relevant work spaces
|
|
146
|
+
will never need to be reallocated. Otherwise, one should at least strive to
|
|
147
|
+
iterate over augmentations in such a way that all children of the same degree
|
|
148
|
+
are given in the same segment of iteration.
|
|
149
|
+
|
|
150
|
+
EXAMPLES::
|
|
151
|
+
|
|
152
|
+
sage: import sage.groups.perm_gps.partn_ref.canonical_augmentation
|
|
153
|
+
|
|
154
|
+
REFERENCE:
|
|
155
|
+
|
|
156
|
+
- [1] McKay, Brendan D. Isomorph-free exhaustive generation. J Algorithms,
|
|
157
|
+
Vol. 26 (1998), pp. 306-324.
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
#*****************************************************************************
|
|
161
|
+
# Copyright (C) 2010 - 2011 Robert L. Miller <rlmillster@gmail.com>
|
|
162
|
+
#
|
|
163
|
+
# This program is free software: you can redistribute it and/or modify
|
|
164
|
+
# it under the terms of the GNU General Public License as published by
|
|
165
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
166
|
+
# (at your option) any later version.
|
|
167
|
+
# http://www.gnu.org/licenses/
|
|
168
|
+
#*****************************************************************************
|
|
169
|
+
|
|
170
|
+
from cysignals.memory cimport sig_malloc, sig_free
|
|
171
|
+
|
|
172
|
+
from sage.groups.perm_gps.partn_ref.data_structures cimport*
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
cdef void *canonical_generator_next(void *can_gen_data, int *degree, bint *mem_err) noexcept:
|
|
176
|
+
r"""
|
|
177
|
+
This function is part of the iterator struct which will iterate over
|
|
178
|
+
objects. Return value of ``NULL`` indicates termination.
|
|
179
|
+
"""
|
|
180
|
+
# degree ignored!
|
|
181
|
+
cdef canonical_generator_data *cgd = <canonical_generator_data *> can_gen_data
|
|
182
|
+
cdef iterator *cur_iter
|
|
183
|
+
cdef void *next_candidate
|
|
184
|
+
cdef void *parent_cand
|
|
185
|
+
cdef void *aug
|
|
186
|
+
cdef int next_cand_deg, parent_cand_deg
|
|
187
|
+
cdef PartitionStack *part
|
|
188
|
+
cdef bint augmentation_is_canonical
|
|
189
|
+
|
|
190
|
+
if cgd.level == 0:
|
|
191
|
+
if cgd.mem_err:
|
|
192
|
+
mem_err[0] = 1
|
|
193
|
+
if cgd.dealloc:
|
|
194
|
+
deallocate_cgd(cgd)
|
|
195
|
+
return NULL
|
|
196
|
+
|
|
197
|
+
while cgd.level < cgd.max_level:
|
|
198
|
+
cur_iter = cgd.iterator_stack + cgd.level - 1
|
|
199
|
+
# getting next candidate at level cgd.level
|
|
200
|
+
aug = cur_iter.next( cur_iter.data, &cgd.degree_stack[cgd.level], &cgd.mem_err )
|
|
201
|
+
if aug is NULL:
|
|
202
|
+
# cur_iter has run out: backtrack by one, return the parent
|
|
203
|
+
cgd.level -= 1
|
|
204
|
+
return cgd.object_stack[cgd.level]
|
|
205
|
+
else:
|
|
206
|
+
next_candidate = cgd.apply_augmentation(cgd.object_stack[cgd.level-1],
|
|
207
|
+
aug, cgd.object_stack[cgd.level], &cgd.degree_stack[cgd.level],
|
|
208
|
+
&cgd.mem_err)
|
|
209
|
+
cgd.object_stack[cgd.level] = next_candidate
|
|
210
|
+
if cgd.mem_err:
|
|
211
|
+
continue
|
|
212
|
+
next_cand_deg = cgd.degree_stack[cgd.level]
|
|
213
|
+
if cgd.agcl_work_spaces[cgd.level] is NULL:
|
|
214
|
+
# allocate a work space if it hasn't been allocated already
|
|
215
|
+
cgd.agcl_work_spaces[cgd.level] = allocate_agcl_work_space(next_cand_deg)
|
|
216
|
+
cgd.ps_stack[cgd.level] = PS_new(next_cand_deg, 0)
|
|
217
|
+
elif next_cand_deg != cgd.agcl_work_spaces[cgd.level].degree:
|
|
218
|
+
# in case the degree has changed, we need to reallocate the work
|
|
219
|
+
# space: this is why one should do augmentations in order of degree
|
|
220
|
+
deallocate_agcl_work_space(cgd.agcl_work_spaces[cgd.level])
|
|
221
|
+
deallocate_agcl_output(cgd.aut_gp_stack[cgd.level])
|
|
222
|
+
cgd.aut_gp_stack[cgd.level] = NULL
|
|
223
|
+
PS_dealloc(cgd.ps_stack[cgd.level])
|
|
224
|
+
cgd.agcl_work_spaces[cgd.level] = allocate_agcl_work_space(next_cand_deg)
|
|
225
|
+
cgd.ps_stack[cgd.level] = PS_new(next_cand_deg, 0)
|
|
226
|
+
if cgd.agcl_work_spaces[cgd.level] is NULL or cgd.ps_stack[cgd.level] is NULL:
|
|
227
|
+
cgd.mem_err = 1
|
|
228
|
+
continue
|
|
229
|
+
# see if next_candidate is canonically augmented
|
|
230
|
+
part = cgd.ps_stack[cgd.level]
|
|
231
|
+
PS_unit_partition(part)
|
|
232
|
+
try:
|
|
233
|
+
cgd.aut_gp_stack[cgd.level] = get_aut_gp_and_can_lab(next_candidate,
|
|
234
|
+
part, next_cand_deg, cgd.all_children_are_equivalent,
|
|
235
|
+
cgd.refine_and_return_invariant, cgd.compare_structures,
|
|
236
|
+
1, cgd.group, cgd.agcl_work_spaces[cgd.level], cgd.aut_gp_stack[cgd.level])
|
|
237
|
+
except MemoryError:
|
|
238
|
+
cgd.mem_err = 1
|
|
239
|
+
continue
|
|
240
|
+
parent_cand = cgd.canonical_parent(next_candidate, cgd.parent_stack[cgd.level-1],
|
|
241
|
+
cgd.aut_gp_stack[cgd.level].relabeling, &parent_cand_deg, &cgd.mem_err)
|
|
242
|
+
if cgd.mem_err:
|
|
243
|
+
continue
|
|
244
|
+
if parent_cand_deg != cgd.degree_stack[cgd.level-1]:
|
|
245
|
+
augmentation_is_canonical = 0
|
|
246
|
+
else:
|
|
247
|
+
if cgd.dc_work_spaces[cgd.level-1] is NULL:
|
|
248
|
+
# allocate a work space if it hasn't been allocated already
|
|
249
|
+
cgd.dc_work_spaces[cgd.level-1] = allocate_dc_work_space(next_cand_deg)
|
|
250
|
+
elif next_cand_deg != cgd.dc_work_spaces[cgd.level-1].degree:
|
|
251
|
+
# in case the degree has changed, we need to reallocate the work
|
|
252
|
+
# space: this is why one should do augmentations in order of degree
|
|
253
|
+
deallocate_dc_work_space(cgd.dc_work_spaces[cgd.level-1])
|
|
254
|
+
cgd.dc_work_spaces[cgd.level-1] = allocate_dc_work_space(next_cand_deg)
|
|
255
|
+
if cgd.dc_work_spaces[cgd.level-1] is NULL:
|
|
256
|
+
cgd.mem_err = 1
|
|
257
|
+
continue
|
|
258
|
+
part = cgd.ps_stack[cgd.level]
|
|
259
|
+
PS_unit_partition(part)
|
|
260
|
+
try:
|
|
261
|
+
augmentation_is_canonical = double_coset(cgd.object_stack[cgd.level-1],
|
|
262
|
+
parent_cand, part, NULL, next_cand_deg,
|
|
263
|
+
cgd.all_children_are_equivalent,
|
|
264
|
+
cgd.refine_and_return_invariant,
|
|
265
|
+
cgd.compare_structures,
|
|
266
|
+
cgd.aut_gp_stack[cgd.level].group, cgd.dc_work_spaces[cgd.level-1], NULL)
|
|
267
|
+
except MemoryError:
|
|
268
|
+
cgd.mem_err = 1
|
|
269
|
+
continue
|
|
270
|
+
if augmentation_is_canonical:
|
|
271
|
+
# the object is canonically augmented, so we add it to the chain
|
|
272
|
+
if cgd.level + 1 != cgd.max_level:
|
|
273
|
+
cgd.mem_err |= cgd.generate_children(next_candidate,
|
|
274
|
+
cgd.aut_gp_stack[cgd.level], cgd.iterator_stack+cgd.level)
|
|
275
|
+
if cgd.mem_err:
|
|
276
|
+
continue
|
|
277
|
+
cgd.level += 1
|
|
278
|
+
|
|
279
|
+
if cgd.level == cgd.max_level:
|
|
280
|
+
# we're at the end of the chain, so just give the object
|
|
281
|
+
cgd.level -= 1
|
|
282
|
+
return cgd.object_stack[cgd.level]
|
|
283
|
+
|
|
284
|
+
cdef canonical_generator_data *allocate_cgd(int max_depth, int degree) noexcept:
|
|
285
|
+
r"""
|
|
286
|
+
Allocate the data part of the canonical generation iterator struct.
|
|
287
|
+
"""
|
|
288
|
+
cdef canonical_generator_data *cgd = <canonical_generator_data *> sig_malloc(sizeof(canonical_generator_data))
|
|
289
|
+
cdef PartitionStack *part
|
|
290
|
+
if cgd is NULL:
|
|
291
|
+
sig_free(cgd)
|
|
292
|
+
return NULL
|
|
293
|
+
cgd.object_stack = <void **> sig_malloc(max_depth * sizeof(void *))
|
|
294
|
+
cgd.degree_stack = <int *> sig_malloc(max_depth * sizeof(int))
|
|
295
|
+
cgd.iterator_stack = <iterator *> sig_malloc(max_depth * sizeof(iterator))
|
|
296
|
+
cgd.aut_gp_stack = <aut_gp_and_can_lab **> sig_malloc(max_depth * sizeof(aut_gp_and_can_lab *))
|
|
297
|
+
cgd.agcl_work_spaces = <agcl_work_space **> sig_malloc(max_depth * sizeof(agcl_work_space *))
|
|
298
|
+
cgd.dc_work_spaces = <dc_work_space **> sig_malloc(max_depth * sizeof(dc_work_space *))
|
|
299
|
+
cgd.ps_stack = <PartitionStack **> sig_malloc(max_depth * sizeof(PartitionStack *))
|
|
300
|
+
cgd.aug_stack = <void **> sig_malloc(max_depth * sizeof(void *))
|
|
301
|
+
cgd.parent_stack = <void **> sig_malloc(max_depth * sizeof(void *))
|
|
302
|
+
part = PS_new(degree, 1)
|
|
303
|
+
cdef agcl_work_space *agclws = allocate_agcl_work_space(degree)
|
|
304
|
+
cdef aut_gp_and_can_lab *output = allocate_agcl_output(degree)
|
|
305
|
+
if cgd.object_stack is NULL or cgd.degree_stack is NULL or \
|
|
306
|
+
cgd.iterator_stack is NULL or cgd.aut_gp_stack is NULL or \
|
|
307
|
+
cgd.agcl_work_spaces is NULL or cgd.dc_work_spaces is NULL or \
|
|
308
|
+
cgd.ps_stack is NULL or cgd.aug_stack is NULL or \
|
|
309
|
+
cgd.parent_stack is NULL or agclws is NULL or output is NULL:
|
|
310
|
+
sig_free(cgd.object_stack)
|
|
311
|
+
sig_free(cgd.degree_stack)
|
|
312
|
+
sig_free(cgd.iterator_stack)
|
|
313
|
+
sig_free(cgd.aut_gp_stack)
|
|
314
|
+
sig_free(cgd.agcl_work_spaces)
|
|
315
|
+
sig_free(cgd.dc_work_spaces)
|
|
316
|
+
sig_free(cgd.ps_stack)
|
|
317
|
+
sig_free(cgd.aug_stack)
|
|
318
|
+
sig_free(cgd.parent_stack)
|
|
319
|
+
sig_free(cgd)
|
|
320
|
+
PS_dealloc(part)
|
|
321
|
+
deallocate_agcl_work_space(agclws)
|
|
322
|
+
deallocate_agcl_output(output)
|
|
323
|
+
return NULL
|
|
324
|
+
|
|
325
|
+
cdef int i
|
|
326
|
+
cgd.allocd_levels = max_depth
|
|
327
|
+
for i from 0 <= i < max_depth:
|
|
328
|
+
cgd.agcl_work_spaces[i] = NULL
|
|
329
|
+
cgd.dc_work_spaces[i] = NULL
|
|
330
|
+
cgd.aut_gp_stack[i] = NULL
|
|
331
|
+
cgd.ps_stack[i] = NULL
|
|
332
|
+
cgd.aug_stack[i] = NULL
|
|
333
|
+
cgd.parent_stack[i] = NULL
|
|
334
|
+
cgd.object_stack[i] = NULL
|
|
335
|
+
cgd.iterator_stack[i].data = NULL
|
|
336
|
+
cgd.agcl_work_spaces[0] = agclws
|
|
337
|
+
cgd.aut_gp_stack[0] = output
|
|
338
|
+
cgd.ps_stack[0] = part
|
|
339
|
+
|
|
340
|
+
cgd.degree_stack[0] = degree
|
|
341
|
+
return cgd
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
cdef void deallocate_cgd(canonical_generator_data *cgd) noexcept:
|
|
345
|
+
r"""
|
|
346
|
+
Deallocate the data part of the canonical generation iterator struct.
|
|
347
|
+
"""
|
|
348
|
+
if cgd is NULL:
|
|
349
|
+
return
|
|
350
|
+
cdef int i
|
|
351
|
+
for i from 0 <= i < cgd.allocd_levels:
|
|
352
|
+
if cgd.agcl_work_spaces[i] is not NULL:
|
|
353
|
+
deallocate_agcl_work_space(cgd.agcl_work_spaces[i])
|
|
354
|
+
if cgd.ps_stack[i] is not NULL:
|
|
355
|
+
PS_dealloc(cgd.ps_stack[i])
|
|
356
|
+
if cgd.dc_work_spaces[i] is not NULL:
|
|
357
|
+
deallocate_dc_work_space(cgd.dc_work_spaces[i])
|
|
358
|
+
if cgd.aut_gp_stack[i] is not NULL:
|
|
359
|
+
deallocate_agcl_output(cgd.aut_gp_stack[i])
|
|
360
|
+
if cgd.object_stack[i] is not NULL:
|
|
361
|
+
cgd.free_object(cgd.object_stack[i])
|
|
362
|
+
if cgd.parent_stack[i] is not NULL:
|
|
363
|
+
cgd.free_object(cgd.parent_stack[i])
|
|
364
|
+
if cgd.aug_stack[i] is not NULL:
|
|
365
|
+
cgd.free_aug(cgd.aug_stack[i])
|
|
366
|
+
if cgd.iterator_stack[i].data is not NULL:
|
|
367
|
+
cgd.free_iter_data(cgd.iterator_stack[i].data)
|
|
368
|
+
sig_free(cgd.object_stack)
|
|
369
|
+
sig_free(cgd.degree_stack)
|
|
370
|
+
sig_free(cgd.iterator_stack)
|
|
371
|
+
sig_free(cgd.aut_gp_stack)
|
|
372
|
+
sig_free(cgd.agcl_work_spaces)
|
|
373
|
+
sig_free(cgd.dc_work_spaces)
|
|
374
|
+
sig_free(cgd.ps_stack)
|
|
375
|
+
sig_free(cgd.aug_stack)
|
|
376
|
+
sig_free(cgd.parent_stack)
|
|
377
|
+
sig_free(cgd)
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
cdef iterator *setup_canonical_generator(int degree,
|
|
381
|
+
bint (*all_children_are_equivalent)(PartitionStack *PS, void *S) noexcept,
|
|
382
|
+
int (*refine_and_return_invariant)(PartitionStack *PS, void *S,
|
|
383
|
+
int *cells_to_refine_by, int ctrb_len) noexcept,
|
|
384
|
+
int (*compare_structures)(int *gamma_1, int *gamma_2, void *S1, void *S2,
|
|
385
|
+
int degree) noexcept,
|
|
386
|
+
int (*generate_children)(void *, aut_gp_and_can_lab *, iterator *) noexcept,
|
|
387
|
+
void *(*apply_augmentation)(void *, void *, void *, int *, bint *) noexcept,
|
|
388
|
+
void (*free_object)(void *) noexcept,
|
|
389
|
+
void (*free_iter_data)(void *) noexcept,
|
|
390
|
+
void (*free_aug)(void *) noexcept,
|
|
391
|
+
void *(*canonical_parent)(void *child, void *parent, int *permutation, int *degree, bint *mem_err) noexcept,
|
|
392
|
+
int max_depth, bint reduce_children, iterator *cangen_prealloc) except NULL:
|
|
393
|
+
"""
|
|
394
|
+
Canonical generation of isomorphism classes of objects.
|
|
395
|
+
|
|
396
|
+
INPUT:
|
|
397
|
+
|
|
398
|
+
- ``S`` -- pointer to the seed object
|
|
399
|
+
|
|
400
|
+
- ``degree`` -- the degree of S
|
|
401
|
+
|
|
402
|
+
- ``all_children_are_equivalent`` -- pointer to a function
|
|
403
|
+
INPUT:
|
|
404
|
+
- ``PS`` -- pointer to a partition stack
|
|
405
|
+
- ``S`` -- pointer to the structure
|
|
406
|
+
OUTPUT:
|
|
407
|
+
bint; returns ``True`` if it can be determined that all refinements below
|
|
408
|
+
the current one will result in an equivalent discrete partition
|
|
409
|
+
- ``refine_and_return_invariant`` -- pointer to a function
|
|
410
|
+
INPUT:
|
|
411
|
+
- ``PS`` -- pointer to a partition stack
|
|
412
|
+
- ``S`` -- pointer to the structure
|
|
413
|
+
- ``alpha`` -- an array consisting of numbers, which indicate the starting
|
|
414
|
+
positions of the cells to refine against (will likely be modified)
|
|
415
|
+
OUTPUT:
|
|
416
|
+
integer; returns an invariant under application of arbitrary permutations
|
|
417
|
+
- ``compare_structures`` -- pointer to a function
|
|
418
|
+
INPUT:
|
|
419
|
+
- ``gamma_1``, ``gamma_2`` -- (list) permutations of the points of S1 and S2
|
|
420
|
+
- ``S1``, ``S2`` -- pointers to the structures
|
|
421
|
+
- ``degree`` -- degree of gamma_1 and 2
|
|
422
|
+
OUTPUT:
|
|
423
|
+
integer; 0 if gamma_1(S1) = gamma_2(S2), otherwise -1 or 1 (see docs for cmp),
|
|
424
|
+
such that the set of all structures is well-ordered
|
|
425
|
+
- ``generate_children`` -- pointer to a function
|
|
426
|
+
INPUT:
|
|
427
|
+
- ``S`` -- pointer to the structure
|
|
428
|
+
- ``group`` -- pointer to an automorphism group (canonical relabeling is not guaranteed)
|
|
429
|
+
- ``it`` -- preallocated iterator struct
|
|
430
|
+
OUTPUT:
|
|
431
|
+
iterator *; pointer to an iterator over inequivalent augmentations of S
|
|
432
|
+
- ``apply_augmentation`` -- pointer to a function
|
|
433
|
+
INPUT:
|
|
434
|
+
- ``parent`` -- object to augment
|
|
435
|
+
- ``aug`` -- the augmentation
|
|
436
|
+
- ``child`` -- space to put the augmented object
|
|
437
|
+
- ``degree`` -- pointer to an int, function should store the degree of the augmented object here
|
|
438
|
+
- ``mem_err`` -- pointer where memory error can be reported
|
|
439
|
+
OUTPUT: pointer to child
|
|
440
|
+
- ``free_object`` -- pointer to a function
|
|
441
|
+
INPUT:
|
|
442
|
+
- ``child`` -- object to be freed
|
|
443
|
+
- ``free_iter_data`` -- pointer to a function
|
|
444
|
+
INPUT:
|
|
445
|
+
- ``data`` -- data part of an iterator struct
|
|
446
|
+
- ``free_aug`` -- pointer to a function
|
|
447
|
+
INPUT:
|
|
448
|
+
- ``aug`` -- augmentation to be freed
|
|
449
|
+
- ``canonical_parent`` -- pointer to a function
|
|
450
|
+
INPUT:
|
|
451
|
+
- ``child`` -- pointer to the structure
|
|
452
|
+
- ``parent`` -- space to store the canonical parent
|
|
453
|
+
- ``permutation`` -- array representing a relabeling of the child
|
|
454
|
+
- ``degree`` -- pointer to store the degree of the parent
|
|
455
|
+
- ``mem_err`` -- pointer for indicating memory errors
|
|
456
|
+
OUTPUT: pointer to the parent
|
|
457
|
+
|
|
458
|
+
- ``max_depth`` -- maximum depth of augmentations to be made from the seed object S
|
|
459
|
+
|
|
460
|
+
OUTPUT: a pointer to an iterator of objects
|
|
461
|
+
"""
|
|
462
|
+
if max_depth <= 1:
|
|
463
|
+
raise ValueError("maximum depth (%d) must be at least two" % max_depth)
|
|
464
|
+
if reduce_children:
|
|
465
|
+
raise NotImplementedError
|
|
466
|
+
|
|
467
|
+
# Allocate memory for the arrays and check for failures:
|
|
468
|
+
cdef iterator *canonical_generator
|
|
469
|
+
cdef canonical_generator_data *cgd
|
|
470
|
+
if cangen_prealloc is NULL:
|
|
471
|
+
canonical_generator = <iterator *> sig_malloc(sizeof(iterator))
|
|
472
|
+
cgd = allocate_cgd(max_depth, degree)
|
|
473
|
+
if canonical_generator is NULL or cgd is NULL:
|
|
474
|
+
sig_free(canonical_generator)
|
|
475
|
+
deallocate_cgd(cgd)
|
|
476
|
+
raise MemoryError
|
|
477
|
+
cgd.dealloc = 1
|
|
478
|
+
else:
|
|
479
|
+
canonical_generator = cangen_prealloc
|
|
480
|
+
cgd = <canonical_generator_data *> canonical_generator.data
|
|
481
|
+
if cgd.degree_stack[0] != degree or cgd.allocd_levels < max_depth:
|
|
482
|
+
deallocate_cgd(cgd)
|
|
483
|
+
cgd = allocate_cgd(max_depth, degree)
|
|
484
|
+
if cgd is NULL:
|
|
485
|
+
raise MemoryError
|
|
486
|
+
cgd.dealloc = 0
|
|
487
|
+
canonical_generator.data = <void *> cgd
|
|
488
|
+
canonical_generator.next = &canonical_generator_next
|
|
489
|
+
|
|
490
|
+
cgd.max_level = max_depth
|
|
491
|
+
cgd.reduce_children = reduce_children
|
|
492
|
+
cgd.mem_err = 0
|
|
493
|
+
|
|
494
|
+
cgd.all_children_are_equivalent = all_children_are_equivalent
|
|
495
|
+
cgd.refine_and_return_invariant = refine_and_return_invariant
|
|
496
|
+
cgd.compare_structures = compare_structures
|
|
497
|
+
|
|
498
|
+
cgd.generate_children = generate_children
|
|
499
|
+
cgd.apply_augmentation = apply_augmentation
|
|
500
|
+
cgd.free_object = free_object
|
|
501
|
+
cgd.free_iter_data = free_iter_data
|
|
502
|
+
cgd.free_aug = free_aug
|
|
503
|
+
cgd.canonical_parent = canonical_parent
|
|
504
|
+
|
|
505
|
+
return canonical_generator
|
|
506
|
+
|
|
507
|
+
cdef iterator *start_canonical_generator(StabilizerChain *group, void *obj, int degree, iterator *canonical_generator) except NULL:
|
|
508
|
+
r"""
|
|
509
|
+
Given the containing group ``group`` and the seed object ``obj`` of degree
|
|
510
|
+
``degree``, initiate the canonical generator stored (and already allocated)
|
|
511
|
+
at ``canonical_generator``.
|
|
512
|
+
"""
|
|
513
|
+
cdef canonical_generator_data *cgd = <canonical_generator_data *> canonical_generator.data
|
|
514
|
+
if obj is NULL:
|
|
515
|
+
obj = cgd.object_stack[0]
|
|
516
|
+
else:
|
|
517
|
+
cgd.object_stack[0] = obj
|
|
518
|
+
cgd.level = 1
|
|
519
|
+
cgd.group = group
|
|
520
|
+
PS_unit_partition(cgd.ps_stack[0])
|
|
521
|
+
try:
|
|
522
|
+
cgd.aut_gp_stack[0] = get_aut_gp_and_can_lab(obj, cgd.ps_stack[0], degree,
|
|
523
|
+
cgd.all_children_are_equivalent,
|
|
524
|
+
cgd.refine_and_return_invariant,
|
|
525
|
+
cgd.compare_structures,
|
|
526
|
+
0, group, cgd.agcl_work_spaces[0], cgd.aut_gp_stack[0])
|
|
527
|
+
except MemoryError:
|
|
528
|
+
cgd.mem_err = 1
|
|
529
|
+
else:
|
|
530
|
+
cgd.mem_err |= cgd.generate_children(obj, cgd.aut_gp_stack[0], cgd.iterator_stack)
|
|
531
|
+
if cgd.mem_err:
|
|
532
|
+
raise MemoryError
|
|
533
|
+
|
|
534
|
+
return canonical_generator
|