schubmult 4.2.0__tar.gz → 5.0.0__tar.gz
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.
- {schubmult-4.2.0 → schubmult-5.0.0}/CHANGELOG.md +37 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/PKG-INFO +11 -3
- schubmult-5.0.0/cpp/Makefile +37 -0
- schubmult-5.0.0/cpp/compare.py +71 -0
- schubmult-5.0.0/cpp/expr.h +164 -0
- schubmult-5.0.0/cpp/kernel_double.h +131 -0
- schubmult-5.0.0/cpp/kernel_double_alt.h +189 -0
- schubmult-5.0.0/cpp/kernel_q.h +194 -0
- schubmult-5.0.0/cpp/kernel_q_double.h +193 -0
- schubmult-5.0.0/cpp/kernel_single.h +135 -0
- schubmult-5.0.0/cpp/positivity.h +371 -0
- schubmult-5.0.0/cpp/schub_common.h +560 -0
- schubmult-5.0.0/cpp/schub_quantum.h +153 -0
- schubmult-5.0.0/cpp/schub_symbolic.h +138 -0
- schubmult-5.0.0/cpp/schubmult_api.h +151 -0
- schubmult-5.0.0/cpp/schubmult_core.cpp +36 -0
- schubmult-5.0.0/cpp/schubmult_double_core.cpp +53 -0
- schubmult-5.0.0/cpp/schubmult_module.cpp +175 -0
- schubmult-5.0.0/cpp/schubmult_q_core.cpp +35 -0
- schubmult-5.0.0/cpp/schubmult_q_double_core.cpp +36 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/images/algostick.png +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/pyproject.toml +14 -4
- schubmult-5.0.0/setup.py +46 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/__init__.py +2 -0
- schubmult-5.0.0/src/schubmult/_scripts/grothmult_double.py +349 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubmult_double.py +2 -2
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/launch_diagram_viewer.sh +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_version.py +3 -3
- schubmult-5.0.0/src/schubmult/mult/_accel.py +70 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/double.py +25 -0
- schubmult-5.0.0/src/schubmult/mult/groth_double.py +732 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/positivity.py +3 -2
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/quantum.py +9 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/quantum_double.py +9 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/single.py +9 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/base_ring.py +12 -3
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/base_schubert_ring.py +9 -3
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/double_grothendieck_ring.py +4 -4
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/double_schubert_ring.py +1 -1
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/quantum_double_schubert_ring.py +1 -1
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/quantum_schubert_ring.py +1 -2
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/schubert_ring.py +2 -2
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/poly/schub_poly.py +36 -35
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/_mul_utils.py +7 -9
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/argparse.py +5 -3
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/test_utils.py +19 -8
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/PKG-INFO +11 -3
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/SOURCES.txt +22 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/entry_points.txt +1 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/requires.txt +1 -1
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/scm_file_list.json +27 -84
- schubmult-5.0.0/src/schubmult.egg-info/scm_version.json +8 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/web/API.md +1 -1
- {schubmult-4.2.0 → schubmult-5.0.0}/web/DEPLOY.md +2 -2
- {schubmult-4.2.0 → schubmult-5.0.0}/web/app.py +2 -2
- schubmult-4.2.0/src/schubmult/mult/groth_double.py +0 -460
- schubmult-4.2.0/src/schubmult.egg-info/scm_version.json +0 -8
- {schubmult-4.2.0 → schubmult-5.0.0}/.gitignore +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/LICENSE +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/MANIFEST.in +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/README.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/API.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/PACKAGE_API.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/bounded_rc_factor_algebra_spec.pdf +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/bounded_rc_factor_algebra_spec.tex +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/index.html +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/__init__.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_cmd_line_json.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_fast_double_schubert_polynomial_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_fast_schubert_polynomial_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_grid_print.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_indexing.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_lr_rule_verify1.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_mul_utils.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_play_script.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/abc.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/abstract_schub_poly.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/argparse.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/assoc_test.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/base_schubert_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/bitfield_row.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/check_q_tableau.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/ck_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/complete_sym.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/coprod_verify.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/coxeter_knuth_check.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/crystal_coprod.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/crystal_graph.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/crystal_graph_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/crystal_tensor_condition.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/decompose_crystal_product.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/demaz_tens.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/dominant_try.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/double.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/elem_sym.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/free_algebra.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/free_algebra_basis.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/functions.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/generate_docs.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/generate_docs.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/generate_test.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/highest_weights.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/jdt_test.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/logging.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/lr_rc_verification.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/lr_rule_verify.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/lr_verification.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/monk_crystal.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/mul_grass.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/mult_double.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/mult_positivity.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/nil_hecke.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/nilplactic.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/nr_verification.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/parsing.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/perm_lib.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/perm_utils.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/plactic.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/plactic_algebra.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/poly_lib.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/polynomial_algebra.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/polynomial_basis.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/positivity.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/qelem_sym.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/quantum.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/quantum_double.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/quantum_schubert_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/rc_graph.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/rc_graph_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/research.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/root_tableau.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/root_tableau.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/save_this_forever.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schub_lib.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schub_poly.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubert_formula.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubert_formula_coproduct.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubert_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_double.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_double_script.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_q.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_q_double.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubprompt.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/separated_descents.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/single.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/skew_root_tableau.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__abc.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__double.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__positivity.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__quantum.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__quantum_double.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__single.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__abstract_schub_poly.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__base_schubert_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__ck_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__crystal_graph_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__free_algebra.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__free_algebra_basis.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__nil_hecke.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__plactic_algebra.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__poly_lib.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__polynomial_algebra.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__polynomial_basis.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__quantum_schubert_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__rc_graph_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__schubert_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__separated_descents.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__tensor_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__tests__test_free_algebra.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__tests__test_plactic.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__variables.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__sage____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__sage___fast_double_schubert_polynomial_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__sage___fast_schubert_polynomial_ring.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__sage___indexing.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__crystal_graph.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__nilplactic.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__perm_lib.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__plactic.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__rc_graph.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__root_tableau.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__schub_poly.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__skew_root_tableau.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symbolic____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symbolic__functions.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symbolic__research.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials__complete_sym.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials__elem_sym.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials__functions.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials__qelem_sym.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils___grid_print.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils___mul_utils.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__argparse.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__bitfield_row.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__logging.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__parsing.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__perm_utils.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__schub_lib.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__test_utils.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts___lr_rule_verify1.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts___play_script.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__assoc_test.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__check_q_tableau.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__coprod_verify.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__coxeter_knuth_check.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__crystal_coprod.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__crystal_tensor_condition.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__decompose_crystal_product.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__demaz_tens.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__dominant_try.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__generate_test.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__highest_weights.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__jdt_test.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__lr_rc_verification.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__lr_rule_verify.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__lr_verification.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__monk_crystal.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__mul_grass.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__nr_verification.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__save_this_forever.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubert_formula.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubert_formula_coproduct.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubmult_double.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubmult_py.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubmult_q.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubmult_q_double.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubprompt.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__tableau_decomp.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests____init__.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_double_schubert.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_quantum_double_schubert.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_quantum_schubert.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_schubert.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_symmetric.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests___cmd_line_json.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests__test_schubmult_double.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests__test_schubmult_py.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests__test_schubmult_q.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests__test_schubmult_q_double.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__test_coproduct_crystal.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__test_crystal_weight.py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/tableau_decomp.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/tensor_ring.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_coproduct_crystal.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_crystal_weight.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_double_schubert.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_free_algebra.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_plactic.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_quantum_double_schubert.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_quantum_schubert.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubert.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubmult_double.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubmult_py.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubmult_q.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubmult_q_double.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_symmetric.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_utils.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/variables.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/schubmult/sage_integration.html +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/docs/search.js +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/images/figure.png +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/requirements.txt +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/schubmult-embed.zip +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/setup.cfg +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/requirements.txt +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/anti_rc_graph_showcase.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/assoc_test_forest.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/assoc_test_slide.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/can_we_split_vars.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/canonical_elem_sym_fact.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/cauchy_dual_poly.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/check_omega_last_row.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/compu_double_forest.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/conjecture_check_positive_charac.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/count_sanity.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/dgroth_by_dschub_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/diag_subwords.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/double_forest_polynomial.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/dschub_cut_coprod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/dual_forest_signed_expansion.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/elem_monom_formula.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/final_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_branching.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_graph_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_nowork_branch.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_prod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_schub.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_squash.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/fslide_prod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/glide_lr_rule_nope.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/graph_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/groth_elem_as_schub.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/groth_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/groth_trans.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/groth_trans_wcgraph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/grothmult_py.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/grove_lr_rule_nope.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/invariant_double_rc.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/isobaric_formula.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/key_branching.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/key_prod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/lr_rc_verification.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/lr_rule_verify.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/make_principal.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/middling_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/pieri_formula_forest.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/quasi_dd_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/rc_molev_sagan.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/rc_product_ms.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubert_formula.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubmult_py.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubmult_q.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubmult_q_double.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubprompt.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/sharp_p_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/slide_coproduct_graphs.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/slide_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unique_code_sort_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/MONK_LR.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/NOTWORKINGBUTSHOULD_lr_rule_verify.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/SANITY_lr_rule_verify.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/_lr_rule_verify1.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/_pieri.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/_play_script.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/algebraic_root_tableau.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/analyze_summed_module.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/are_crys_unique_weight.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/artin_squash.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/assoc_crystal_action.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/assoc_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/augmentaton_map.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/bimodule_tester.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/bpd_auto.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/can_we_cope.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/can_we_generate_hw.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/cauchy_rc_section.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/check_q_tableau.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/check_rc_free_module.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/claude_suggest_coprod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/code_calc.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/coprod_verify.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/coxeter_knuth_check.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/crystal_coprod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/crystal_tensor_condition.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/decompose_crystal_product.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/decompose_demaz.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/decompose_dom_tensor.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/demaz_tens.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/div_diff_exchange_action.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/divdiff_param_rc.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/does_kjdt_preserve_ck.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/does_left_squash_work.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/does_squash_insert.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dominant_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dominant_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dominant_try.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dominifiable_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dual_double_schub.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dual_half_root_sum.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dual_pieri_leibniz.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dual_schub_check.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dualpieri_works.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dualschub_divdiff.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dynamic_tableau.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ed_skew_attempt.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ed_skew_attempt_WORKS_N_4.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/eg_lift.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/factor_product.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/factorize_schub_rc.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/fast_forest_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/find_rc_module_relations.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/find_squash_decomp.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forest_compute.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forest_dual_basis_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forest_invariant_cancels.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forest_rc_transition.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forforest_rc_prod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/formula_for_schub_coeff.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forward_rc_prod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/full_coprod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/generate_equation.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/generate_rc_product_tikz.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ghost_equivalence.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/grass_hw_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/grasstens_coproduct_hom_to_rc.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/highest_weights.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hom_of_coalgebras.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hpds_run.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hw_ghost_requivalence.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hw_ring_weight.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hw_schub_schur_mul.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hw_schub_schur_reduce.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ideal_decomp.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/indpull.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/insertion_monk_same.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/interactive_rc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/investigate_forest_invariant.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/is_insertion_pieri.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/is_lowest_weight_trunc_principal.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/is_principal_hw_subalgebra_positive.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/is_quasisym.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/iso_of_rings.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/jdt_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/jigger_lr.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/key_dual_basis_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/leibniz_formula.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/little_bump_viewer.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/little_map.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/make_bpds.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/map_to_poly_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/maybe_the_coprod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/mixed_algebra_hom_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/monk_bpd_squash.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/monk_crystal.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/more_claude.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/mul_tableau_decomp.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/noncom_cauchy.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/nr_verification.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/nsym_rc_graph_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/omega_play.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/omfg_bimodule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/parse_qschub.sage +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/parse_qschub.sage.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/partial_vary.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/path_to_bpd.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/pieri_formula_crystal.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/possible_product_extension.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/potential_lr_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/product of.sty +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/pull_back_coprod_crystal.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/pull_pull_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/quasi_monom.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/quasisym_rc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/qy_rc_ring_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_basis_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_bijection_tab.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_comodule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_coprod_test.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_crystal_iso.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_schubert_schur_hom.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_transition.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/real_product.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rsk_biject_rc.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ruletry.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/save_this_forever.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/schub_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/schub_pairing.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/schubert_fast_coproduct.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/schubert_formula_coproduct.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/simple_fa_rc_coprod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/slide_poly.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/speed_j_pieri.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/split_it.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_biject.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_bpd.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_cauchy.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_coproduct.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_hom_free_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/stanley_dual_schub.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/strip_replacement.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/tableau_decomp.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_divdiff_bounded_rc.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_inverse_crystal_product.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_schub_well_defined.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_three_row_product.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_two_row_product.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/the_LR_rule.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/the_fk_module.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/theorem_cauchy.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/this_is_the_rc_coprod.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/three_bimod_sanity.py.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/unique_base_rc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/universal_schub_eval.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/until_pull.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/verify_report.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/vex_tree.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/which_perms_forest.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/which_rcs_ghost.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/verify_paper_formulas.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/verify_quantum_triple_positive.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/which_schubs_forest.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/abc.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/anti_rc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/bpd.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/chute_move_element.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/crystal_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/double_forest.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/hecke_plactic.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/hpd.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/increasing_tableau.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/indexed_forests.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/inversions_tableau.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/mbpd.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/nilplactic.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/permutation.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/pipe_dream.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/plactic.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/planar_history.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/quasi_crystal_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/rc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/root_tableau.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/schub_poly.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/schubert_monomial_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/set_valued_tableau.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/set_word.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/wc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/groth.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/separated_descents.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/alt_rc_graph_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/bounded_rc_factor_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/bounded_rc_forest_factor_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/bounded_wc_factor_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/bpd_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/chute_move_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/crystal_graph_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/dual_rc_graph_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/eg_plactic_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/eg_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/forest_invariant_rc_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/forest_rc_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/grass_tensor_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/grove_wc_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/hw_rc_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/key_rc_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/plactic_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/qy_rc_graph_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/rc_graph_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/rc_schubert_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/schubert_monomial_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/schubert_rc_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/slide_rc_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/wc_graph_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/direct_product_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/_core.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/composition_schubert_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/elementary_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/forest_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/free_algebra_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/fundamental_slide_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/glide_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/grothendieck_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/grove_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/j_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/jt_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/key_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/lascoux_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/monomial_slide_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/nelementary_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/schubert_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/schubert_schur_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/schur_elementary_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/separated_descents_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/word_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/z_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/nsym.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/_core.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/anti_schubert_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/base_polynomial_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/composition_schubert_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/double_forest_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/elem_sym_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/forest_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/fundamental_slide_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/glide_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/grothendieck_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/grove_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/key_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/lascoux_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/monomial_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/monomial_slide_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/polynomial_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/schubert_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/sepdesc_poly_basis.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/printing.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/product_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/quasisymmetric_functions.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/beta_coxeter.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/chevalley.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/grothendieck_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/nil_hecke.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/parabolic_quantum_double_schubert_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/parabolic_quantum_schubert_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/separated_descents.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/tensor_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/thompson_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/common_polys.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/functions.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/poly/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/poly/variables.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/complete_sym.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/elem_sym.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/functions.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/qelem_sym.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/__init__.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/_grid_print.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/logging.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/parsing.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/perm_utils.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/schub_lib.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/tuple_utils.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/visualization.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/dependency_links.txt +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/top_level.txt +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_anti_rc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_bpd.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_indexed_forests.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_inversions_tableau.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_mbpd.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_nilplactic.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_permutation_order.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_pipe_dream.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_rc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_wc_graph.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_combinatorial.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_duality.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_forest_rc_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_free_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_parabolic_quantum_ring.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_polynomial_algebra.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_public_imports.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_schubert_rings.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/_cmd_line_json.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_double/schubmult_double_3_7_1_6_2_5_4T2_3_5_4_1_7_6_mixed-var_display-positive.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_double/schubmult_double_code_3_0_5T2_1_0_4_display-positive.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_double/schubmult_double_code_coprod_5_0_1_2T2_3_display-positive.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_double/schubmult_double_coprod_3_7_1_6_2_5_4T2_4_6_display-positive_mixed-var.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_double/schubmult_double_mixed-var_display-positive_coprod_code_1_0_2_0_1T2_4.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_py/schubmult_py_code_5_0_3_1_2T1_0_3_2_0_5.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_q/schubmult_q_code_2_0_5T3_0_2.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_q/schubmult_q_parabolic_2_3_code_1_2T1_3.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_q_double/schubmult_q_double_code_2_0_5T3_0_2.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_q_double/schubmult_q_double_code_2_0_5T3_0_2_display-positive.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_q_double/schubmult_q_double_code_2_0_5T3_0_2_mixed-var_display-positive.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_q_double/schubmult_q_double_parabolic_2_3_code_1_2T1_3_display-positive.json +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/test_schubmult_double.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/test_schubmult_py.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/test_schubmult_q.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/test_schubmult_q_double.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/tests/test_api_surface.py +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/web/README.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/web/templates/index.html +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/wordpress-plugin/README.md +0 -0
- {schubmult-4.2.0 → schubmult-5.0.0}/wordpress-plugin/schubmult-embed.php +0 -0
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.0.0
|
|
4
|
+
|
|
5
|
+
The multiplication kernels are now compiled C++. This release consolidates the
|
|
6
|
+
5.0.0b1 and 5.0.0b2 pre-releases.
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- **The Schubert multiplication kernels run in a C++ extension (`schubmult.schubmult_cpp`).**
|
|
11
|
+
`schubmult_py`, `schubmult_double`, `schubmult_q_fast`, `schubmult_q_double_fast`,
|
|
12
|
+
`schubmult_double_from_elems` and `schubmult_double_alt_from_elems` — and therefore
|
|
13
|
+
every ring product built on them — dispatch to ports of the same algorithms in `cpp/`.
|
|
14
|
+
Results are identical to the Python kernels (coefficients are still unexpanded symengine
|
|
15
|
+
expressions); typical products are one to two orders of magnitude faster. The Python
|
|
16
|
+
kernels remain as the fallback for permutations beyond the compiled size limit
|
|
17
|
+
(`MAXN`, default 32). `SCHUBMULT_NO_CPP=1` forces the Python kernels.
|
|
18
|
+
- **Binary wheels for Linux, macOS and Windows** (CPython 3.10–3.14). The extension uses
|
|
19
|
+
only the Python C API — coefficients are handled as `symengine` Python objects — so it
|
|
20
|
+
has no SymEngine C++ dependency and builds from source with any C++17 compiler.
|
|
21
|
+
- Ring products no longer re-scan every coefficient's `free_symbols` when assembling the
|
|
22
|
+
result, and products are computed directly in the ring's variables instead of in generic
|
|
23
|
+
variables followed by a substitution pass.
|
|
24
|
+
- `requires-python` is now `>=3.10` (3.9 was declared but never supported).
|
|
25
|
+
- The PuLP requirement is `PuLP>=2.7.0,<4`. The PuLP 4 pre-releases are a rewrite with an
|
|
26
|
+
incompatible API (no `LpVariable(name=...)`, no bundled CBC) and broke `--display-positive`.
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- Standalone C++ command-line tools in `cpp/` (`schubmult_core`, `schubmult_double_core`,
|
|
31
|
+
`schubmult_q_core`, `schubmult_q_double_core`) mirroring the CLI scripts, including
|
|
32
|
+
`--display-positive` for the double kernel (MILP via `cbc`). These are development tools
|
|
33
|
+
built with `make`; they need the SymEngine C++ headers.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- The script test fixtures are located relative to the test modules, so the test suite
|
|
38
|
+
runs against a non-editable install.
|
|
39
|
+
|
|
3
40
|
## 4.2.0
|
|
4
41
|
|
|
5
42
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: schubmult
|
|
3
|
-
Version:
|
|
3
|
+
Version: 5.0.0
|
|
4
4
|
Summary: Package for algebraic computation with single, double, and quantum Schubert polynomials
|
|
5
5
|
Author-email: Matt Samuel <schubmult@gmail.com>
|
|
6
6
|
Maintainer-email: Matt Samuel <schubmult@gmail.com>
|
|
@@ -683,13 +683,21 @@ Project-URL: Homepage, http://schubmult.org
|
|
|
683
683
|
Project-URL: Repository, https://github.com/matthematics/schubmult
|
|
684
684
|
Keywords: Schubert,polynomial,double,algebra
|
|
685
685
|
Classifier: Programming Language :: Python
|
|
686
|
-
|
|
686
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
687
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
688
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
689
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
690
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
691
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
692
|
+
Classifier: Programming Language :: C++
|
|
693
|
+
Classifier: Operating System :: OS Independent
|
|
694
|
+
Requires-Python: >=3.10
|
|
687
695
|
Description-Content-Type: text/markdown
|
|
688
696
|
License-File: LICENSE
|
|
689
697
|
Requires-Dist: numpy
|
|
690
698
|
Requires-Dist: joblib
|
|
691
699
|
Requires-Dist: latex2sympy2_extended
|
|
692
|
-
Requires-Dist: PuLP
|
|
700
|
+
Requires-Dist: PuLP<4,>=2.7.0
|
|
693
701
|
Requires-Dist: symengine>=0.14.1
|
|
694
702
|
Requires-Dist: sympy>=1.14.0
|
|
695
703
|
Requires-Dist: psutil
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
CXX ?= g++
|
|
2
|
+
CXXFLAGS ?= -O3 -march=native -std=c++17 -Wall -Wextra
|
|
3
|
+
MAXN ?= 32
|
|
4
|
+
BUILD ?= build
|
|
5
|
+
|
|
6
|
+
# SymEngine C++ (for schubmult_double_core); defaults to the active conda env
|
|
7
|
+
SYMENGINE_PREFIX ?= $(CONDA_PREFIX)
|
|
8
|
+
SE_CXXFLAGS = -isystem $(SYMENGINE_PREFIX)/include
|
|
9
|
+
SE_LDFLAGS = -L$(SYMENGINE_PREFIX)/lib -lsymengine -lflint -lgmp -Wl,-rpath,$(SYMENGINE_PREFIX)/lib
|
|
10
|
+
|
|
11
|
+
BINS = $(BUILD)/schubmult_core $(BUILD)/schubmult_q_core $(BUILD)/schubmult_double_core $(BUILD)/schubmult_q_double_core
|
|
12
|
+
|
|
13
|
+
all: $(BINS)
|
|
14
|
+
|
|
15
|
+
$(BUILD):
|
|
16
|
+
mkdir -p $(BUILD)
|
|
17
|
+
|
|
18
|
+
$(BUILD)/schubmult_core: schubmult_core.cpp schub_common.h | $(BUILD)
|
|
19
|
+
$(CXX) $(CXXFLAGS) -DMAXN=$(MAXN) -o $@ $<
|
|
20
|
+
|
|
21
|
+
$(BUILD)/schubmult_q_core: schubmult_q_core.cpp schub_common.h schub_quantum.h | $(BUILD)
|
|
22
|
+
$(CXX) $(CXXFLAGS) -DMAXN=$(MAXN) -o $@ $<
|
|
23
|
+
|
|
24
|
+
$(BUILD)/schubmult_double_core: schubmult_double_core.cpp schub_common.h schub_symbolic.h positivity.h | $(BUILD)
|
|
25
|
+
$(CXX) $(CXXFLAGS) -DMAXN=$(MAXN) $(SE_CXXFLAGS) -o $@ $< $(SE_LDFLAGS)
|
|
26
|
+
|
|
27
|
+
$(BUILD)/schubmult_q_double_core: schubmult_q_double_core.cpp schub_common.h schub_quantum.h schub_symbolic.h | $(BUILD)
|
|
28
|
+
$(CXX) $(CXXFLAGS) -DMAXN=$(MAXN) $(SE_CXXFLAGS) -o $@ $< $(SE_LDFLAGS)
|
|
29
|
+
|
|
30
|
+
clean:
|
|
31
|
+
rm -rf $(BUILD) ../build ../src/schubmult/schubmult_cpp*.so ../src/schubmult/schubmult_cpp*.pyd
|
|
32
|
+
|
|
33
|
+
# Python extension: built by the package's setup.py (plain Python C API, no SymEngine C++ needed).
|
|
34
|
+
python:
|
|
35
|
+
cd .. && pip install --no-build-isolation -e .
|
|
36
|
+
|
|
37
|
+
.PHONY: all clean python
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Cross-check cpp/schubmult_core against schubmult.mult.single.schubmult_py.
|
|
2
|
+
|
|
3
|
+
usage: python compare.py [n] [num_random] [seed]
|
|
4
|
+
Runs all pairs in S_n for n <= 5 (else random pairs), reports mismatches and timing.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import itertools
|
|
8
|
+
import random
|
|
9
|
+
import subprocess
|
|
10
|
+
import sys
|
|
11
|
+
import time
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
from schubmult import Permutation, schubmult_py
|
|
15
|
+
|
|
16
|
+
BIN = Path(__file__).with_name("build") / "schubmult_core"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def run_cpp(u, v):
|
|
20
|
+
args = [str(BIN), *map(str, u), "-", *map(str, v)]
|
|
21
|
+
out = subprocess.run(args, capture_output=True, text=True, check=True).stdout
|
|
22
|
+
res = {}
|
|
23
|
+
for line in out.splitlines():
|
|
24
|
+
val, perm = line.split(" ", 1)
|
|
25
|
+
res[Permutation(eval(perm))] = int(val)
|
|
26
|
+
return res
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def run_py(u, v):
|
|
30
|
+
perms = sorted([Permutation(u), Permutation(v)], reverse=True, key=lambda x: sum((~x).theta()) - x.inv)
|
|
31
|
+
d = schubmult_py({perms[0]: 1}, perms[1])
|
|
32
|
+
return {k: val for k, val in d.items() if val != 0}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def main():
|
|
36
|
+
n = int(sys.argv[1]) if len(sys.argv) > 1 else 5
|
|
37
|
+
num_random = int(sys.argv[2]) if len(sys.argv) > 2 else 50
|
|
38
|
+
seed = int(sys.argv[3]) if len(sys.argv) > 3 else 0
|
|
39
|
+
rng = random.Random(seed)
|
|
40
|
+
if n <= 5:
|
|
41
|
+
allp = [list(p) for p in itertools.permutations(range(1, n + 1))]
|
|
42
|
+
pairs = [(u, v) for u in allp for v in allp]
|
|
43
|
+
else:
|
|
44
|
+
pairs = []
|
|
45
|
+
for _ in range(num_random):
|
|
46
|
+
u = list(range(1, n + 1))
|
|
47
|
+
v = list(range(1, n + 1))
|
|
48
|
+
rng.shuffle(u)
|
|
49
|
+
rng.shuffle(v)
|
|
50
|
+
pairs.append((u, v))
|
|
51
|
+
bad = 0
|
|
52
|
+
t_cpp = t_py = 0.0
|
|
53
|
+
for u, v in pairs:
|
|
54
|
+
t0 = time.perf_counter()
|
|
55
|
+
a = run_cpp(u, v)
|
|
56
|
+
t1 = time.perf_counter()
|
|
57
|
+
b = run_py(u, v)
|
|
58
|
+
t2 = time.perf_counter()
|
|
59
|
+
t_cpp += t1 - t0
|
|
60
|
+
t_py += t2 - t1
|
|
61
|
+
if a != b:
|
|
62
|
+
bad += 1
|
|
63
|
+
print(f"MISMATCH u={u} v={v}")
|
|
64
|
+
for k in set(a) | set(b):
|
|
65
|
+
if a.get(k) != b.get(k):
|
|
66
|
+
print(f" {k}: cpp={a.get(k)} py={b.get(k)}")
|
|
67
|
+
print(f"{len(pairs)} pairs, {bad} mismatches; cpp {t_cpp:.2f}s (incl. process spawn), py {t_py:.2f}s")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
if __name__ == "__main__":
|
|
71
|
+
main()
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// expr.h: the symbolic-coefficient type used by the double / quantum-double kernels, with two
|
|
2
|
+
// interchangeable backends selected at compile time:
|
|
3
|
+
//
|
|
4
|
+
// default SymEngine C++ (RCP<const Basic>) — for the standalone CLI tools.
|
|
5
|
+
// SCHUB_PYEXPR Python objects (PyObject*) driven through the Python C API — for the
|
|
6
|
+
// schubmult_cpp extension. Coefficients are then whatever the `symengine`
|
|
7
|
+
// Python package hands back, so the extension needs no SymEngine C++ headers
|
|
8
|
+
// or library and links against nothing but Python. Any Python exception is
|
|
9
|
+
// carried as a C++ exception (PyErrorSet) to the module boundary.
|
|
10
|
+
//
|
|
11
|
+
// The kernels only use the small ex_* vocabulary below.
|
|
12
|
+
|
|
13
|
+
#pragma once
|
|
14
|
+
|
|
15
|
+
#include <stdexcept>
|
|
16
|
+
#include <string>
|
|
17
|
+
#include <vector>
|
|
18
|
+
|
|
19
|
+
#ifdef SCHUB_PYEXPR
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Python-object backend
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
#ifndef PY_SSIZE_T_CLEAN
|
|
24
|
+
#define PY_SSIZE_T_CLEAN
|
|
25
|
+
#endif
|
|
26
|
+
#include <Python.h>
|
|
27
|
+
|
|
28
|
+
struct PyErrorSet : std::runtime_error {
|
|
29
|
+
PyErrorSet() : std::runtime_error("Python exception") {}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Owning reference to a Python object (null allowed).
|
|
33
|
+
class Expr {
|
|
34
|
+
PyObject* p_ = nullptr;
|
|
35
|
+
|
|
36
|
+
public:
|
|
37
|
+
Expr() = default;
|
|
38
|
+
explicit Expr(PyObject* p, bool steal = true) : p_(p) {
|
|
39
|
+
if (p_ && !steal) Py_INCREF(p_);
|
|
40
|
+
}
|
|
41
|
+
Expr(const Expr& o) : p_(o.p_) {
|
|
42
|
+
if (p_) Py_INCREF(p_);
|
|
43
|
+
}
|
|
44
|
+
Expr(Expr&& o) noexcept : p_(o.p_) { o.p_ = nullptr; }
|
|
45
|
+
Expr& operator=(Expr o) noexcept {
|
|
46
|
+
std::swap(p_, o.p_);
|
|
47
|
+
return *this;
|
|
48
|
+
}
|
|
49
|
+
~Expr() {
|
|
50
|
+
if (p_) Py_DECREF(p_);
|
|
51
|
+
}
|
|
52
|
+
bool is_null() const { return p_ == nullptr; }
|
|
53
|
+
PyObject* get() const { return p_; }
|
|
54
|
+
PyObject* release() {
|
|
55
|
+
PyObject* r = p_;
|
|
56
|
+
p_ = nullptr;
|
|
57
|
+
return r;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
typedef std::vector<Expr> ExprVec;
|
|
62
|
+
|
|
63
|
+
namespace pyexpr_detail {
|
|
64
|
+
// Result of a Python call; throws if the call failed.
|
|
65
|
+
inline Expr checked(PyObject* r) {
|
|
66
|
+
if (!r) throw PyErrorSet();
|
|
67
|
+
return Expr(r);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
struct Syms {
|
|
71
|
+
Expr add, mul, integer, symbol, sympify, zero, one;
|
|
72
|
+
Syms() {
|
|
73
|
+
Expr mod = checked(PyImport_ImportModule("symengine"));
|
|
74
|
+
add = checked(PyObject_GetAttrString(mod.get(), "Add"));
|
|
75
|
+
mul = checked(PyObject_GetAttrString(mod.get(), "Mul"));
|
|
76
|
+
integer = checked(PyObject_GetAttrString(mod.get(), "Integer"));
|
|
77
|
+
symbol = checked(PyObject_GetAttrString(mod.get(), "Symbol"));
|
|
78
|
+
sympify = checked(PyObject_GetAttrString(mod.get(), "sympify"));
|
|
79
|
+
zero = checked(PyObject_CallFunction(integer.get(), "i", 0));
|
|
80
|
+
one = checked(PyObject_CallFunction(integer.get(), "i", 1));
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
// Heap-allocated and never freed: a static object's destructor would Py_DECREF after the
|
|
84
|
+
// interpreter has finalized.
|
|
85
|
+
inline Syms& syms() {
|
|
86
|
+
static Syms* s = new Syms();
|
|
87
|
+
return *s;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
inline Expr call_star(const Expr& f, const ExprVec& args) {
|
|
91
|
+
Expr tup = checked(PyTuple_New((Py_ssize_t)args.size()));
|
|
92
|
+
for (size_t i = 0; i < args.size(); ++i) {
|
|
93
|
+
Py_INCREF(args[i].get());
|
|
94
|
+
PyTuple_SET_ITEM(tup.get(), (Py_ssize_t)i, args[i].get());
|
|
95
|
+
}
|
|
96
|
+
return checked(PyObject_CallObject(f.get(), tup.get()));
|
|
97
|
+
}
|
|
98
|
+
} // namespace pyexpr_detail
|
|
99
|
+
|
|
100
|
+
inline Expr ex_zero() { return pyexpr_detail::syms().zero; }
|
|
101
|
+
inline Expr ex_one() { return pyexpr_detail::syms().one; }
|
|
102
|
+
inline Expr ex_integer(long n) { return pyexpr_detail::checked(PyObject_CallFunction(pyexpr_detail::syms().integer.get(), "l", n)); }
|
|
103
|
+
inline Expr ex_symbol(const std::string& name) { return pyexpr_detail::checked(PyObject_CallFunction(pyexpr_detail::syms().symbol.get(), "s", name.c_str())); }
|
|
104
|
+
inline Expr ex_add(const Expr& a, const Expr& b) { return pyexpr_detail::checked(PyNumber_Add(a.get(), b.get())); }
|
|
105
|
+
inline Expr ex_sub(const Expr& a, const Expr& b) { return pyexpr_detail::checked(PyNumber_Subtract(a.get(), b.get())); }
|
|
106
|
+
inline Expr ex_mul(const Expr& a, const Expr& b) { return pyexpr_detail::checked(PyNumber_Multiply(a.get(), b.get())); }
|
|
107
|
+
inline Expr ex_neg(const Expr& a) { return pyexpr_detail::checked(PyNumber_Negative(a.get())); }
|
|
108
|
+
inline Expr ex_pow(const Expr& a, int n) {
|
|
109
|
+
Expr e = ex_integer(n);
|
|
110
|
+
return pyexpr_detail::checked(PyNumber_Power(a.get(), e.get(), Py_None));
|
|
111
|
+
}
|
|
112
|
+
inline Expr ex_add(const ExprVec& v) {
|
|
113
|
+
if (v.empty()) return ex_zero();
|
|
114
|
+
if (v.size() == 1) return v[0];
|
|
115
|
+
return pyexpr_detail::call_star(pyexpr_detail::syms().add, v);
|
|
116
|
+
}
|
|
117
|
+
inline Expr ex_mul(const ExprVec& v) {
|
|
118
|
+
if (v.empty()) return ex_one();
|
|
119
|
+
if (v.size() == 1) return v[0];
|
|
120
|
+
return pyexpr_detail::call_star(pyexpr_detail::syms().mul, v);
|
|
121
|
+
}
|
|
122
|
+
inline bool ex_is_zero(const Expr& e) {
|
|
123
|
+
int r = PyObject_RichCompareBool(e.get(), pyexpr_detail::syms().zero.get(), Py_EQ);
|
|
124
|
+
if (r < 0) throw PyErrorSet();
|
|
125
|
+
return r == 1;
|
|
126
|
+
}
|
|
127
|
+
inline Expr ex_sympify(const Expr& e) { return pyexpr_detail::checked(PyObject_CallFunctionObjArgs(pyexpr_detail::syms().sympify.get(), e.get(), nullptr)); }
|
|
128
|
+
inline std::string ex_str(const Expr& e) {
|
|
129
|
+
Expr s = pyexpr_detail::checked(PyObject_Str(e.get()));
|
|
130
|
+
const char* c = PyUnicode_AsUTF8(s.get());
|
|
131
|
+
if (!c) throw PyErrorSet();
|
|
132
|
+
return c;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
#else
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// SymEngine C++ backend
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
#include <symengine/add.h>
|
|
140
|
+
#include <symengine/basic.h>
|
|
141
|
+
#include <symengine/constants.h>
|
|
142
|
+
#include <symengine/integer.h>
|
|
143
|
+
#include <symengine/mul.h>
|
|
144
|
+
#include <symengine/pow.h>
|
|
145
|
+
#include <symengine/printers.h>
|
|
146
|
+
#include <symengine/symbol.h>
|
|
147
|
+
|
|
148
|
+
typedef SymEngine::RCP<const SymEngine::Basic> Expr;
|
|
149
|
+
typedef SymEngine::vec_basic ExprVec;
|
|
150
|
+
|
|
151
|
+
inline Expr ex_zero() { return SymEngine::zero; }
|
|
152
|
+
inline Expr ex_one() { return SymEngine::one; }
|
|
153
|
+
inline Expr ex_integer(long n) { return SymEngine::integer(n); }
|
|
154
|
+
inline Expr ex_symbol(const std::string& name) { return SymEngine::symbol(name); }
|
|
155
|
+
inline Expr ex_add(const Expr& a, const Expr& b) { return SymEngine::add(a, b); }
|
|
156
|
+
inline Expr ex_sub(const Expr& a, const Expr& b) { return SymEngine::sub(a, b); }
|
|
157
|
+
inline Expr ex_mul(const Expr& a, const Expr& b) { return SymEngine::mul(a, b); }
|
|
158
|
+
inline Expr ex_neg(const Expr& a) { return SymEngine::neg(a); }
|
|
159
|
+
inline Expr ex_pow(const Expr& a, int n) { return SymEngine::pow(a, SymEngine::integer(n)); }
|
|
160
|
+
inline Expr ex_add(const ExprVec& v) { return SymEngine::add(v); }
|
|
161
|
+
inline Expr ex_mul(const ExprVec& v) { return SymEngine::mul(v); }
|
|
162
|
+
inline bool ex_is_zero(const Expr& e) { return SymEngine::eq(*e, *SymEngine::zero); }
|
|
163
|
+
inline std::string ex_str(const Expr& e) { return e->__str__(); }
|
|
164
|
+
#endif
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// kernel_double.h: C++ port of schubmult_double (library form; the CLI lives in schubmult_double_core.cpp).
|
|
2
|
+
|
|
3
|
+
#pragma once
|
|
4
|
+
|
|
5
|
+
#include "schub_symbolic.h"
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// schubmult_double
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
#ifndef SCHUB_EXPRDICT
|
|
12
|
+
#define SCHUB_EXPRDICT
|
|
13
|
+
typedef std::vector<std::pair<Perm, Expr>> ExprDict;
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
static ExprDict schubmult_double(const ExprDict& perm_dict, const Perm& v, int n, ElemSymCache& esc) {
|
|
17
|
+
MultSetup S = mult_setup(v);
|
|
18
|
+
if (S.trivial) return perm_dict;
|
|
19
|
+
const VPaths& vp = S.vp;
|
|
20
|
+
const std::vector<int>& th = S.th;
|
|
21
|
+
int thL = (int)th.size();
|
|
22
|
+
if (vp.id_start == UINT32_MAX) return {};
|
|
23
|
+
uint32_t id_vmu = 0; // level[thL] == {vmu}
|
|
24
|
+
|
|
25
|
+
ZIdx zidx = compute_zidx(vp);
|
|
26
|
+
|
|
27
|
+
// Each sum entry holds the pending terms; at the end of a level they are summed
|
|
28
|
+
// (SymEngine's Add merges like terms at the top level, as Python's + does) and
|
|
29
|
+
// structurally zero entries are dropped. Nothing is ever expanded.
|
|
30
|
+
typedef PermTable<ExprVec> Table;
|
|
31
|
+
typedef Table::VSum VSum;
|
|
32
|
+
std::unordered_map<Perm, ExprVec, PermHash> result;
|
|
33
|
+
|
|
34
|
+
Table tabA, tabB;
|
|
35
|
+
Table* A = &tabA;
|
|
36
|
+
Table* B = &tabB;
|
|
37
|
+
|
|
38
|
+
std::vector<std::pair<Perm, int>> newperms;
|
|
39
|
+
std::vector<int> yidx;
|
|
40
|
+
|
|
41
|
+
for (const auto& kv : perm_dict) {
|
|
42
|
+
const Perm& u = kv.first;
|
|
43
|
+
if (is_zero(kv.second)) continue;
|
|
44
|
+
int inv_u = perm_inv(u, n);
|
|
45
|
+
|
|
46
|
+
A->reset();
|
|
47
|
+
A->sums[A->intern(u, inv_u)].push_back({vp.id_start, ExprVec{kv.second}});
|
|
48
|
+
|
|
49
|
+
for (int index = 0; index < thL; ++index) {
|
|
50
|
+
int k = th[index];
|
|
51
|
+
const auto& trans = vp.trans[index];
|
|
52
|
+
#ifdef STATS
|
|
53
|
+
double t0 = now_s();
|
|
54
|
+
size_t n_terms = 0;
|
|
55
|
+
#endif
|
|
56
|
+
B->reset();
|
|
57
|
+
|
|
58
|
+
for (uint32_t sid = 0; sid < A->count; ++sid) {
|
|
59
|
+
const std::vector<VSum>& sums = A->sums[sid];
|
|
60
|
+
if (sums.empty()) continue;
|
|
61
|
+
const Perm& up = A->perms[sid];
|
|
62
|
+
int inv_up = A->inv[sid];
|
|
63
|
+
int p = std::min(vp.mx_th[index], S.inv_mu - S.inv_vmu - (inv_up - inv_u));
|
|
64
|
+
if (p < 0) p = 0;
|
|
65
|
+
elem_sym_perms(up, p, k, n, newperms);
|
|
66
|
+
|
|
67
|
+
for (const auto& npd : newperms) {
|
|
68
|
+
const Perm& up2 = npd.first;
|
|
69
|
+
int udiff = npd.second, newk = k - udiff;
|
|
70
|
+
yvars_of(up, up2, k, yidx);
|
|
71
|
+
long id = -1;
|
|
72
|
+
for (const VSum& sv : sums) {
|
|
73
|
+
const Expr& sumval = sv.second[0];
|
|
74
|
+
const auto& trs = trans[sv.first];
|
|
75
|
+
for (size_t t = 0; t < trs.size(); ++t) {
|
|
76
|
+
const Trans& tr = trs[t];
|
|
77
|
+
if (newk < tr.vdiff) continue; // elem_sym_func == 0
|
|
78
|
+
Expr term;
|
|
79
|
+
if (newk == tr.vdiff) {
|
|
80
|
+
term = sumval; // elem_sym_func == 1
|
|
81
|
+
} else {
|
|
82
|
+
const Expr& esf = esc.get(newk - tr.vdiff, newk, yidx, zidx[index][sv.first][t]);
|
|
83
|
+
if (is_zero(esf)) continue;
|
|
84
|
+
term = ex_mul(sumval, esf);
|
|
85
|
+
}
|
|
86
|
+
if (tr.s < 0) term = ex_neg(term);
|
|
87
|
+
if (id < 0) id = B->intern(up2, inv_up + udiff);
|
|
88
|
+
B->get_or_insert((uint32_t)id, tr.v2).push_back(term);
|
|
89
|
+
#ifdef STATS
|
|
90
|
+
++n_terms;
|
|
91
|
+
#endif
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// sum each entry's pending terms; drop the zeros
|
|
98
|
+
size_t alive = 0, live_sums = 0;
|
|
99
|
+
for (auto& vec : B->sums) {
|
|
100
|
+
for (VSum& e : vec) {
|
|
101
|
+
Expr s = ex_add(e.second);
|
|
102
|
+
e.second.clear();
|
|
103
|
+
if (!is_zero(s)) e.second.push_back(s);
|
|
104
|
+
}
|
|
105
|
+
vec.erase(std::remove_if(vec.begin(), vec.end(), [](const VSum& e) { return e.second.empty(); }), vec.end());
|
|
106
|
+
if (!vec.empty()) {
|
|
107
|
+
++alive;
|
|
108
|
+
live_sums += vec.size();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
std::swap(A, B);
|
|
112
|
+
#ifdef STATS
|
|
113
|
+
std::fprintf(stderr, "idx %2d k=%2d terms=%10zu targets=%8u states_out=%8zu sums_out=%10zu esf_cache=%zu %.3fs\n", index, k, n_terms, A->count, alive, live_sums, esc.memo.size(),
|
|
114
|
+
now_s() - t0);
|
|
115
|
+
#endif
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
for (uint32_t sid = 0; sid < A->count; ++sid)
|
|
119
|
+
if (ExprVec* c = A->find(sid, id_vmu)) result[A->perms[sid]].push_back((*c)[0]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
ExprDict out;
|
|
123
|
+
out.reserve(result.size());
|
|
124
|
+
for (auto& kv : result) {
|
|
125
|
+
Expr s = ex_add(kv.second);
|
|
126
|
+
if (!is_zero(s)) out.push_back({kv.first, s});
|
|
127
|
+
}
|
|
128
|
+
std::sort(out.begin(), out.end(), [](const std::pair<Perm, Expr>& x, const std::pair<Perm, Expr>& y) { return x.first < y.first; });
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// kernel_double_alt.h: C++ port of schubmult.mult.double.schubmult_double_alt_from_elems_backwards
|
|
2
|
+
// (= schubmult_double_alt_from_elems), the pull-out-variable recursion used for positivity,
|
|
3
|
+
// together with schub_lib.pull_out_var and elem_sym_positional_perms.
|
|
4
|
+
//
|
|
5
|
+
// The elementary symmetric objects come from esc.builder, so this reproduces the Python
|
|
6
|
+
// exactly for any elem_func (FactorialElemSym, elem_sym_poly, ...).
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "schub_symbolic.h"
|
|
11
|
+
|
|
12
|
+
#include <map>
|
|
13
|
+
|
|
14
|
+
// Python's len() of a trimmed Permutation: max(trimmed length, 2). Only used where the
|
|
15
|
+
// Python algorithm's loop bounds depend on it; the representation stays fixed-size.
|
|
16
|
+
static int py_len(const Perm& a) {
|
|
17
|
+
int L = MAXN;
|
|
18
|
+
while (L > 0 && a.p[L - 1] == L) --L;
|
|
19
|
+
return std::max(L, 2);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static int perm_inv_full(const Perm& a) { return perm_inv(a, MAXN); }
|
|
23
|
+
|
|
24
|
+
struct PullOut {
|
|
25
|
+
std::vector<int> index_list; // 1-based values of v at the retained positions
|
|
26
|
+
Perm vp;
|
|
27
|
+
bool operator<(const PullOut& o) const {
|
|
28
|
+
if (vp != o.vp) return vp < o.vp;
|
|
29
|
+
return index_list < o.index_list;
|
|
30
|
+
}
|
|
31
|
+
bool operator==(const PullOut& o) const { return vp == o.vp && index_list == o.index_list; }
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// schub_lib.pull_out_var(vnum, v): the set of (index_list, vp).
|
|
35
|
+
static std::vector<PullOut> pull_out_var(int vnum, const Perm& v) {
|
|
36
|
+
int L = py_len(v);
|
|
37
|
+
std::vector<PullOut> ret;
|
|
38
|
+
if (vnum >= L) {
|
|
39
|
+
ret.push_back({{}, v});
|
|
40
|
+
return ret;
|
|
41
|
+
}
|
|
42
|
+
if (L + 2 > MAXN) die("pull_out_var: permutation too long for MAXN");
|
|
43
|
+
auto add_result = [&](const Perm& vpm) {
|
|
44
|
+
// vpm with position vnum-1 (holding L+1) removed, values above L+1 shifted down
|
|
45
|
+
Perm vp = identity_perm();
|
|
46
|
+
int out = 0;
|
|
47
|
+
int lenv = py_len(vpm);
|
|
48
|
+
for (int i = 0; i < lenv; ++i) {
|
|
49
|
+
if (i == vnum - 1) continue;
|
|
50
|
+
int x = vpm.p[i];
|
|
51
|
+
vp.p[out++] = (uint8_t)(x > L + 1 ? x - 1 : x);
|
|
52
|
+
}
|
|
53
|
+
int lvp = py_len(vp);
|
|
54
|
+
PullOut po;
|
|
55
|
+
po.vp = vp;
|
|
56
|
+
for (int i = vnum; i < L; ++i)
|
|
57
|
+
if ((i > lvp && v.p[i] == i) || (i <= lvp && v.p[i] == vp.p[i - 1])) po.index_list.push_back(v.p[i]);
|
|
58
|
+
ret.push_back(std::move(po));
|
|
59
|
+
};
|
|
60
|
+
std::vector<std::pair<Perm, int>> cur, nxt;
|
|
61
|
+
cur.push_back({v, 0});
|
|
62
|
+
for (int p = 0; p < L + 1 - vnum; ++p) {
|
|
63
|
+
nxt.clear();
|
|
64
|
+
for (const auto& e : cur) {
|
|
65
|
+
const Perm& vpm = e.first;
|
|
66
|
+
int b = e.second;
|
|
67
|
+
if (vpm.p[vnum - 1] == L + 1) add_result(vpm);
|
|
68
|
+
for (int j = vnum; j < L + 2; ++j) {
|
|
69
|
+
if (vpm.p[j] <= b) continue;
|
|
70
|
+
for (int i = 0; i < vnum; ++i)
|
|
71
|
+
if (bruhat_ascent(vpm, i, j)) nxt.push_back({swapped(vpm, i, j), vpm.p[j]});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
std::swap(cur, nxt);
|
|
75
|
+
}
|
|
76
|
+
for (const auto& e : cur)
|
|
77
|
+
if (e.first.p[vnum - 1] == L + 1) add_result(e.first);
|
|
78
|
+
std::sort(ret.begin(), ret.end());
|
|
79
|
+
ret.erase(std::unique(ret.begin(), ret.end()), ret.end());
|
|
80
|
+
return ret;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
struct PosUp {
|
|
84
|
+
Perm perm;
|
|
85
|
+
int udiff;
|
|
86
|
+
int sign;
|
|
87
|
+
bool operator<(const PosUp& o) const {
|
|
88
|
+
if (perm != o.perm) return perm < o.perm;
|
|
89
|
+
if (udiff != o.udiff) return udiff < o.udiff;
|
|
90
|
+
return sign < o.sign;
|
|
91
|
+
}
|
|
92
|
+
bool operator==(const PosUp& o) const { return perm == o.perm && udiff == o.udiff && sign == o.sign; }
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// schub_lib.elem_sym_positional_perms(orig, p, *k) with k given 0-based; returns the set of
|
|
96
|
+
// (perm, udiff, sign).
|
|
97
|
+
static std::vector<PosUp> elem_sym_positional_perms(const Perm& orig, int p, const std::vector<int>& kpos) {
|
|
98
|
+
std::vector<PosUp> total{{orig, 0, 1}};
|
|
99
|
+
std::vector<std::pair<Perm, int>> cur{{orig, 1}}, nxt;
|
|
100
|
+
int maxk = 0;
|
|
101
|
+
for (int q : kpos) maxk = std::max(maxk, q);
|
|
102
|
+
bool ink[MAXN] = {false};
|
|
103
|
+
for (int q : kpos) ink[q] = true;
|
|
104
|
+
for (int pp = 0; pp < p; ++pp) {
|
|
105
|
+
nxt.clear();
|
|
106
|
+
for (const auto& e : cur) {
|
|
107
|
+
const Perm& up = e.first;
|
|
108
|
+
int sign = e.second;
|
|
109
|
+
int bound = py_len(up) + maxk + 1;
|
|
110
|
+
if (bound > MAXN) die("elem_sym_positional_perms: permutation too long for MAXN");
|
|
111
|
+
for (int i : kpos) {
|
|
112
|
+
if (up.p[i] != orig.p[i]) continue;
|
|
113
|
+
for (int j = 0; j < bound; ++j) {
|
|
114
|
+
if (ink[j]) continue;
|
|
115
|
+
int a = std::min(i, j), b = std::max(i, j);
|
|
116
|
+
if (!bruhat_ascent(up, a, b)) continue;
|
|
117
|
+
Perm np = swapped(up, a, b);
|
|
118
|
+
int ns = i < j ? sign : -sign;
|
|
119
|
+
nxt.push_back({np, ns});
|
|
120
|
+
total.push_back({np, pp + 1, ns});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
std::sort(nxt.begin(), nxt.end());
|
|
125
|
+
nxt.erase(std::unique(nxt.begin(), nxt.end()), nxt.end());
|
|
126
|
+
std::swap(cur, nxt);
|
|
127
|
+
}
|
|
128
|
+
std::sort(total.begin(), total.end());
|
|
129
|
+
total.erase(std::unique(total.begin(), total.end()), total.end());
|
|
130
|
+
return total;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
#ifndef SCHUB_EXPRDICT
|
|
134
|
+
#define SCHUB_EXPRDICT
|
|
135
|
+
typedef std::vector<std::pair<Perm, Expr>> ExprDict;
|
|
136
|
+
#endif
|
|
137
|
+
|
|
138
|
+
typedef std::unordered_map<Perm, ExprVec, PermHash> TermMap;
|
|
139
|
+
|
|
140
|
+
static TermMap alt_backwards_rec(const TermMap& perm_dict, const Perm& v, ElemSymCache& esc) {
|
|
141
|
+
if (perm_inv_full(v) == 0) return perm_dict;
|
|
142
|
+
Perm vinv = inverse(v, MAXN);
|
|
143
|
+
int index = 0; // max descent of ~v, 1-based
|
|
144
|
+
for (int i = 0; i + 1 < MAXN; ++i)
|
|
145
|
+
if (vinv.p[i] > vinv.p[i + 1]) index = i + 1;
|
|
146
|
+
std::vector<PullOut> L = pull_out_var(index, vinv);
|
|
147
|
+
|
|
148
|
+
TermMap ret;
|
|
149
|
+
std::map<Perm, TermMap> cache; // by new_v, as the Python
|
|
150
|
+
std::vector<int> kpos, yidx;
|
|
151
|
+
for (const PullOut& po : L) {
|
|
152
|
+
auto it = cache.find(po.vp);
|
|
153
|
+
if (it == cache.end()) it = cache.emplace(po.vp, alt_backwards_rec(perm_dict, inverse(po.vp, MAXN), esc)).first;
|
|
154
|
+
const TermMap& start = it->second;
|
|
155
|
+
int m = (int)po.index_list.size();
|
|
156
|
+
kpos.clear();
|
|
157
|
+
for (int i : po.index_list) kpos.push_back(i - 1);
|
|
158
|
+
for (const auto& kv : start) {
|
|
159
|
+
const Perm& u = kv.first;
|
|
160
|
+
Expr val = ex_add(kv.second);
|
|
161
|
+
if (is_zero(val)) continue;
|
|
162
|
+
for (const PosUp& e : elem_sym_positional_perms(u, m, kpos)) {
|
|
163
|
+
yidx.clear();
|
|
164
|
+
for (int i : po.index_list)
|
|
165
|
+
if (e.perm.p[i - 1] == u.p[i - 1]) yidx.push_back(e.perm.p[i - 1]);
|
|
166
|
+
const Expr& ef = esc.get(m - e.udiff, m - e.udiff, yidx, std::vector<int>{index});
|
|
167
|
+
if (is_zero(ef)) continue;
|
|
168
|
+
Expr term = ex_mul(val, ef);
|
|
169
|
+
if (e.sign < 0) term = ex_neg(term);
|
|
170
|
+
ret[e.perm].push_back(term);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return ret;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// schubmult_double_alt_from_elems_backwards(perm_dict, v, var2, var3, elem_func)
|
|
178
|
+
static ExprDict schubmult_double_alt_from_elems_backwards(const ExprDict& perm_dict, const Perm& v, ElemSymCache& esc) {
|
|
179
|
+
TermMap in;
|
|
180
|
+
for (const auto& kv : perm_dict) in[kv.first].push_back(kv.second);
|
|
181
|
+
TermMap out = alt_backwards_rec(in, v, esc);
|
|
182
|
+
ExprDict r;
|
|
183
|
+
for (auto& kv : out) {
|
|
184
|
+
Expr s = ex_add(kv.second);
|
|
185
|
+
if (!is_zero(s)) r.push_back({kv.first, s});
|
|
186
|
+
}
|
|
187
|
+
std::sort(r.begin(), r.end(), [](const std::pair<Perm, Expr>& x, const std::pair<Perm, Expr>& y) { return x.first < y.first; });
|
|
188
|
+
return r;
|
|
189
|
+
}
|