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.
Files changed (663) hide show
  1. {schubmult-4.2.0 → schubmult-5.0.0}/CHANGELOG.md +37 -0
  2. {schubmult-4.2.0 → schubmult-5.0.0}/PKG-INFO +11 -3
  3. schubmult-5.0.0/cpp/Makefile +37 -0
  4. schubmult-5.0.0/cpp/compare.py +71 -0
  5. schubmult-5.0.0/cpp/expr.h +164 -0
  6. schubmult-5.0.0/cpp/kernel_double.h +131 -0
  7. schubmult-5.0.0/cpp/kernel_double_alt.h +189 -0
  8. schubmult-5.0.0/cpp/kernel_q.h +194 -0
  9. schubmult-5.0.0/cpp/kernel_q_double.h +193 -0
  10. schubmult-5.0.0/cpp/kernel_single.h +135 -0
  11. schubmult-5.0.0/cpp/positivity.h +371 -0
  12. schubmult-5.0.0/cpp/schub_common.h +560 -0
  13. schubmult-5.0.0/cpp/schub_quantum.h +153 -0
  14. schubmult-5.0.0/cpp/schub_symbolic.h +138 -0
  15. schubmult-5.0.0/cpp/schubmult_api.h +151 -0
  16. schubmult-5.0.0/cpp/schubmult_core.cpp +36 -0
  17. schubmult-5.0.0/cpp/schubmult_double_core.cpp +53 -0
  18. schubmult-5.0.0/cpp/schubmult_module.cpp +175 -0
  19. schubmult-5.0.0/cpp/schubmult_q_core.cpp +35 -0
  20. schubmult-5.0.0/cpp/schubmult_q_double_core.cpp +36 -0
  21. {schubmult-4.2.0 → schubmult-5.0.0}/images/algostick.png +0 -0
  22. {schubmult-4.2.0 → schubmult-5.0.0}/pyproject.toml +14 -4
  23. schubmult-5.0.0/setup.py +46 -0
  24. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/__init__.py +2 -0
  25. schubmult-5.0.0/src/schubmult/_scripts/grothmult_double.py +349 -0
  26. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubmult_double.py +2 -2
  27. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/launch_diagram_viewer.sh +0 -0
  28. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_version.py +3 -3
  29. schubmult-5.0.0/src/schubmult/mult/_accel.py +70 -0
  30. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/double.py +25 -0
  31. schubmult-5.0.0/src/schubmult/mult/groth_double.py +732 -0
  32. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/positivity.py +3 -2
  33. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/quantum.py +9 -0
  34. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/quantum_double.py +9 -0
  35. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/single.py +9 -0
  36. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/base_ring.py +12 -3
  37. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/base_schubert_ring.py +9 -3
  38. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/double_grothendieck_ring.py +4 -4
  39. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/double_schubert_ring.py +1 -1
  40. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/quantum_double_schubert_ring.py +1 -1
  41. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/quantum_schubert_ring.py +1 -2
  42. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/schubert_ring.py +2 -2
  43. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/poly/schub_poly.py +36 -35
  44. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/_mul_utils.py +7 -9
  45. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/argparse.py +5 -3
  46. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/test_utils.py +19 -8
  47. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/PKG-INFO +11 -3
  48. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/SOURCES.txt +22 -0
  49. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/entry_points.txt +1 -0
  50. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/requires.txt +1 -1
  51. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/scm_file_list.json +27 -84
  52. schubmult-5.0.0/src/schubmult.egg-info/scm_version.json +8 -0
  53. {schubmult-4.2.0 → schubmult-5.0.0}/web/API.md +1 -1
  54. {schubmult-4.2.0 → schubmult-5.0.0}/web/DEPLOY.md +2 -2
  55. {schubmult-4.2.0 → schubmult-5.0.0}/web/app.py +2 -2
  56. schubmult-4.2.0/src/schubmult/mult/groth_double.py +0 -460
  57. schubmult-4.2.0/src/schubmult.egg-info/scm_version.json +0 -8
  58. {schubmult-4.2.0 → schubmult-5.0.0}/.gitignore +0 -0
  59. {schubmult-4.2.0 → schubmult-5.0.0}/LICENSE +0 -0
  60. {schubmult-4.2.0 → schubmult-5.0.0}/MANIFEST.in +0 -0
  61. {schubmult-4.2.0 → schubmult-5.0.0}/README.md +0 -0
  62. {schubmult-4.2.0 → schubmult-5.0.0}/docs/API.md +0 -0
  63. {schubmult-4.2.0 → schubmult-5.0.0}/docs/PACKAGE_API.md +0 -0
  64. {schubmult-4.2.0 → schubmult-5.0.0}/docs/bounded_rc_factor_algebra_spec.pdf +0 -0
  65. {schubmult-4.2.0 → schubmult-5.0.0}/docs/bounded_rc_factor_algebra_spec.tex +0 -0
  66. {schubmult-4.2.0 → schubmult-5.0.0}/docs/index.html +0 -0
  67. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/__init__.md +0 -0
  68. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_cmd_line_json.md +0 -0
  69. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_fast_double_schubert_polynomial_ring.md +0 -0
  70. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_fast_schubert_polynomial_ring.md +0 -0
  71. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_grid_print.md +0 -0
  72. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_indexing.md +0 -0
  73. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_lr_rule_verify1.md +0 -0
  74. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_mul_utils.md +0 -0
  75. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/_play_script.md +0 -0
  76. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/abc.md +0 -0
  77. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/abstract_schub_poly.md +0 -0
  78. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/argparse.md +0 -0
  79. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/assoc_test.md +0 -0
  80. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/base_schubert_ring.md +0 -0
  81. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/bitfield_row.md +0 -0
  82. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/check_q_tableau.md +0 -0
  83. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/ck_ring.md +0 -0
  84. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/complete_sym.md +0 -0
  85. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/coprod_verify.md +0 -0
  86. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/coxeter_knuth_check.md +0 -0
  87. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/crystal_coprod.md +0 -0
  88. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/crystal_graph.md +0 -0
  89. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/crystal_graph_ring.md +0 -0
  90. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/crystal_tensor_condition.md +0 -0
  91. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/decompose_crystal_product.md +0 -0
  92. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/demaz_tens.md +0 -0
  93. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/dominant_try.md +0 -0
  94. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/double.md +0 -0
  95. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/elem_sym.md +0 -0
  96. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/free_algebra.md +0 -0
  97. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/free_algebra_basis.md +0 -0
  98. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/functions.md +0 -0
  99. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/generate_docs.md +0 -0
  100. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/generate_docs.py.md +0 -0
  101. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/generate_test.md +0 -0
  102. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/highest_weights.md +0 -0
  103. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/jdt_test.md +0 -0
  104. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/logging.md +0 -0
  105. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/lr_rc_verification.md +0 -0
  106. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/lr_rule_verify.md +0 -0
  107. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/lr_verification.md +0 -0
  108. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/monk_crystal.md +0 -0
  109. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/mul_grass.md +0 -0
  110. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/mult_double.md +0 -0
  111. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/mult_positivity.md +0 -0
  112. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/nil_hecke.md +0 -0
  113. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/nilplactic.md +0 -0
  114. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/nr_verification.md +0 -0
  115. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/parsing.md +0 -0
  116. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/perm_lib.md +0 -0
  117. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/perm_utils.md +0 -0
  118. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/plactic.md +0 -0
  119. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/plactic_algebra.md +0 -0
  120. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/poly_lib.md +0 -0
  121. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/polynomial_algebra.md +0 -0
  122. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/polynomial_basis.md +0 -0
  123. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/positivity.md +0 -0
  124. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/qelem_sym.md +0 -0
  125. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/quantum.md +0 -0
  126. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/quantum_double.md +0 -0
  127. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/quantum_schubert_ring.md +0 -0
  128. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/rc_graph.md +0 -0
  129. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/rc_graph_ring.md +0 -0
  130. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/research.md +0 -0
  131. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/root_tableau.md +0 -0
  132. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/root_tableau.py.md +0 -0
  133. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/save_this_forever.md +0 -0
  134. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schub_lib.md +0 -0
  135. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schub_poly.md +0 -0
  136. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubert_formula.md +0 -0
  137. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubert_formula_coproduct.md +0 -0
  138. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubert_ring.md +0 -0
  139. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_double.md +0 -0
  140. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_double_script.md +0 -0
  141. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_py.md +0 -0
  142. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_q.md +0 -0
  143. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubmult_q_double.md +0 -0
  144. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/schubprompt.md +0 -0
  145. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/separated_descents.md +0 -0
  146. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/single.md +0 -0
  147. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/skew_root_tableau.md +0 -0
  148. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult____init__.py.md +0 -0
  149. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__abc.py.md +0 -0
  150. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__double.py.md +0 -0
  151. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__positivity.py.md +0 -0
  152. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__quantum.py.md +0 -0
  153. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__quantum_double.py.md +0 -0
  154. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__mult__single.py.md +0 -0
  155. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings____init__.py.md +0 -0
  156. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__abstract_schub_poly.py.md +0 -0
  157. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__base_schubert_ring.py.md +0 -0
  158. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__ck_ring.py.md +0 -0
  159. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__crystal_graph_ring.py.md +0 -0
  160. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__free_algebra.py.md +0 -0
  161. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__free_algebra_basis.py.md +0 -0
  162. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__nil_hecke.py.md +0 -0
  163. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__plactic_algebra.py.md +0 -0
  164. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__poly_lib.py.md +0 -0
  165. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__polynomial_algebra.py.md +0 -0
  166. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__polynomial_basis.py.md +0 -0
  167. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__quantum_schubert_ring.py.md +0 -0
  168. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__rc_graph_ring.py.md +0 -0
  169. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__schubert_ring.py.md +0 -0
  170. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__separated_descents.py.md +0 -0
  171. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__tensor_ring.py.md +0 -0
  172. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__tests__test_free_algebra.py.md +0 -0
  173. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__tests__test_plactic.py.md +0 -0
  174. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__rings__variables.py.md +0 -0
  175. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__sage____init__.py.md +0 -0
  176. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__sage___fast_double_schubert_polynomial_ring.py.md +0 -0
  177. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__sage___fast_schubert_polynomial_ring.py.md +0 -0
  178. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__sage___indexing.py.md +0 -0
  179. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib____init__.py.md +0 -0
  180. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__crystal_graph.py.md +0 -0
  181. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__nilplactic.py.md +0 -0
  182. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__perm_lib.py.md +0 -0
  183. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__plactic.py.md +0 -0
  184. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__rc_graph.py.md +0 -0
  185. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__root_tableau.py.md +0 -0
  186. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__schub_poly.py.md +0 -0
  187. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__schub_lib__skew_root_tableau.py.md +0 -0
  188. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symbolic____init__.py.md +0 -0
  189. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symbolic__functions.py.md +0 -0
  190. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symbolic__research.py.md +0 -0
  191. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials____init__.py.md +0 -0
  192. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials__complete_sym.py.md +0 -0
  193. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials__elem_sym.py.md +0 -0
  194. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials__functions.py.md +0 -0
  195. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__symmetric_polynomials__qelem_sym.py.md +0 -0
  196. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils____init__.py.md +0 -0
  197. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils___grid_print.py.md +0 -0
  198. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils___mul_utils.py.md +0 -0
  199. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__argparse.py.md +0 -0
  200. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__bitfield_row.py.md +0 -0
  201. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__logging.py.md +0 -0
  202. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__parsing.py.md +0 -0
  203. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__perm_utils.py.md +0 -0
  204. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__schub_lib.py.md +0 -0
  205. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__schubmult__utils__test_utils.py.md +0 -0
  206. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts____init__.py.md +0 -0
  207. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts___lr_rule_verify1.py.md +0 -0
  208. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts___play_script.py.md +0 -0
  209. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__assoc_test.py.md +0 -0
  210. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__check_q_tableau.py.md +0 -0
  211. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__coprod_verify.py.md +0 -0
  212. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__coxeter_knuth_check.py.md +0 -0
  213. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__crystal_coprod.py.md +0 -0
  214. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__crystal_tensor_condition.py.md +0 -0
  215. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__decompose_crystal_product.py.md +0 -0
  216. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__demaz_tens.py.md +0 -0
  217. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__dominant_try.py.md +0 -0
  218. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__generate_test.py.md +0 -0
  219. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__highest_weights.py.md +0 -0
  220. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__jdt_test.py.md +0 -0
  221. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__lr_rc_verification.py.md +0 -0
  222. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__lr_rule_verify.py.md +0 -0
  223. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__lr_verification.py.md +0 -0
  224. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__monk_crystal.py.md +0 -0
  225. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__mul_grass.py.md +0 -0
  226. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__nr_verification.py.md +0 -0
  227. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__save_this_forever.py.md +0 -0
  228. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubert_formula.py.md +0 -0
  229. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubert_formula_coproduct.py.md +0 -0
  230. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubmult_double.py.md +0 -0
  231. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubmult_py.py.md +0 -0
  232. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubmult_q.py.md +0 -0
  233. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubmult_q_double.py.md +0 -0
  234. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__schubprompt.py.md +0 -0
  235. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__scripts__tableau_decomp.py.md +0 -0
  236. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests____init__.py.md +0 -0
  237. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_double_schubert.py.md +0 -0
  238. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_quantum_double_schubert.py.md +0 -0
  239. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_quantum_schubert.py.md +0 -0
  240. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_schubert.py.md +0 -0
  241. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__ring_tests__test_symmetric.py.md +0 -0
  242. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests___cmd_line_json.py.md +0 -0
  243. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests__test_schubmult_double.py.md +0 -0
  244. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests__test_schubmult_py.py.md +0 -0
  245. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests__test_schubmult_q.py.md +0 -0
  246. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__script_tests__test_schubmult_q_double.py.md +0 -0
  247. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__test_coproduct_crystal.py.md +0 -0
  248. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/src__tests__test_crystal_weight.py.md +0 -0
  249. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/tableau_decomp.md +0 -0
  250. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/tensor_ring.md +0 -0
  251. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_coproduct_crystal.md +0 -0
  252. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_crystal_weight.md +0 -0
  253. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_double_schubert.md +0 -0
  254. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_free_algebra.md +0 -0
  255. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_plactic.md +0 -0
  256. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_quantum_double_schubert.md +0 -0
  257. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_quantum_schubert.md +0 -0
  258. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubert.md +0 -0
  259. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubmult_double.md +0 -0
  260. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubmult_py.md +0 -0
  261. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubmult_q.md +0 -0
  262. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_schubmult_q_double.md +0 -0
  263. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_symmetric.md +0 -0
  264. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/test_utils.md +0 -0
  265. {schubmult-4.2.0 → schubmult-5.0.0}/docs/modules/variables.md +0 -0
  266. {schubmult-4.2.0 → schubmult-5.0.0}/docs/schubmult/sage_integration.html +0 -0
  267. {schubmult-4.2.0 → schubmult-5.0.0}/docs/search.js +0 -0
  268. {schubmult-4.2.0 → schubmult-5.0.0}/images/figure.png +0 -0
  269. {schubmult-4.2.0 → schubmult-5.0.0}/requirements.txt +0 -0
  270. {schubmult-4.2.0 → schubmult-5.0.0}/schubmult-embed.zip +0 -0
  271. {schubmult-4.2.0 → schubmult-5.0.0}/setup.cfg +0 -0
  272. {schubmult-4.2.0 → schubmult-5.0.0}/src/requirements.txt +0 -0
  273. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/__init__.py +0 -0
  274. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/anti_rc_graph_showcase.py +0 -0
  275. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/assoc_test_forest.py +0 -0
  276. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/assoc_test_slide.py +0 -0
  277. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/can_we_split_vars.py +0 -0
  278. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/canonical_elem_sym_fact.py +0 -0
  279. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/cauchy_dual_poly.py +0 -0
  280. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/check_omega_last_row.py +0 -0
  281. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/compu_double_forest.py +0 -0
  282. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/conjecture_check_positive_charac.py +0 -0
  283. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/count_sanity.py +0 -0
  284. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/dgroth_by_dschub_test.py +0 -0
  285. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/diag_subwords.py +0 -0
  286. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/double_forest_polynomial.py +0 -0
  287. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/dschub_cut_coprod.py +0 -0
  288. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/dual_forest_signed_expansion.py +0 -0
  289. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/elem_monom_formula.py +0 -0
  290. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/final_lr_rule.py +0 -0
  291. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_branching.py +0 -0
  292. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_graph_lr_rule.py +0 -0
  293. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_lr_rule.py +0 -0
  294. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_nowork_branch.py +0 -0
  295. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_poly_basis.py +0 -0
  296. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_prod.py +0 -0
  297. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_schub.py +0 -0
  298. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/forest_squash.py +0 -0
  299. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/fslide_prod.py +0 -0
  300. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/glide_lr_rule_nope.py +0 -0
  301. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/graph_lr_rule.py +0 -0
  302. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/groth_elem_as_schub.py +0 -0
  303. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/groth_lr_rule.py +0 -0
  304. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/groth_trans.py +0 -0
  305. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/groth_trans_wcgraph.py +0 -0
  306. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/grothmult_py.py +0 -0
  307. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/grove_lr_rule_nope.py +0 -0
  308. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/invariant_double_rc.py +0 -0
  309. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/isobaric_formula.py +0 -0
  310. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/key_branching.py +0 -0
  311. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/key_prod.py +0 -0
  312. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/lr_rc_verification.py +0 -0
  313. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/lr_rule_verify.py +0 -0
  314. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/make_principal.py +0 -0
  315. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/middling_lr_rule.py +0 -0
  316. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/pieri_formula_forest.py +0 -0
  317. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/quasi_dd_test.py +0 -0
  318. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/rc_molev_sagan.py +0 -0
  319. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/rc_product_ms.py +0 -0
  320. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubert_formula.py +0 -0
  321. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubmult_py.py +0 -0
  322. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubmult_q.py +0 -0
  323. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubmult_q_double.py +0 -0
  324. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/schubprompt.py +0 -0
  325. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/sharp_p_test.py +0 -0
  326. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/slide_coproduct_graphs.py +0 -0
  327. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/slide_lr_rule.py +0 -0
  328. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unique_code_sort_test.py +0 -0
  329. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/MONK_LR.py +0 -0
  330. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/NOTWORKINGBUTSHOULD_lr_rule_verify.py +0 -0
  331. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/SANITY_lr_rule_verify.py +0 -0
  332. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/__init__.py +0 -0
  333. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/_lr_rule_verify1.py +0 -0
  334. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/_pieri.py +0 -0
  335. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/_play_script.py +0 -0
  336. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/algebraic_root_tableau.py +0 -0
  337. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/analyze_summed_module.py +0 -0
  338. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/are_crys_unique_weight.py +0 -0
  339. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/artin_squash.py +0 -0
  340. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/assoc_crystal_action.py +0 -0
  341. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/assoc_test.py +0 -0
  342. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/augmentaton_map.py +0 -0
  343. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/bimodule_tester.py +0 -0
  344. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/bpd_auto.py +0 -0
  345. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/can_we_cope.py +0 -0
  346. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/can_we_generate_hw.py +0 -0
  347. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/cauchy_rc_section.py +0 -0
  348. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/check_q_tableau.py +0 -0
  349. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/check_rc_free_module.py +0 -0
  350. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/claude_suggest_coprod.py +0 -0
  351. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/code_calc.py +0 -0
  352. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/coprod_verify.py +0 -0
  353. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/coxeter_knuth_check.py +0 -0
  354. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/crystal_coprod.py +0 -0
  355. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/crystal_tensor_condition.py +0 -0
  356. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/decompose_crystal_product.py +0 -0
  357. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/decompose_demaz.py +0 -0
  358. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/decompose_dom_tensor.py +0 -0
  359. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/demaz_tens.py +0 -0
  360. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/div_diff_exchange_action.py +0 -0
  361. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/divdiff_param_rc.py +0 -0
  362. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/does_kjdt_preserve_ck.py +0 -0
  363. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/does_left_squash_work.py +0 -0
  364. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/does_squash_insert.py +0 -0
  365. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dominant_lr_rule.py +0 -0
  366. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dominant_ring.py +0 -0
  367. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dominant_try.py +0 -0
  368. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dominifiable_rule.py +0 -0
  369. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dual_double_schub.py +0 -0
  370. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dual_half_root_sum.py +0 -0
  371. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dual_pieri_leibniz.py +0 -0
  372. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dual_schub_check.py +0 -0
  373. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dualpieri_works.py +0 -0
  374. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dualschub_divdiff.py +0 -0
  375. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/dynamic_tableau.py +0 -0
  376. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ed_skew_attempt.py +0 -0
  377. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ed_skew_attempt_WORKS_N_4.py +0 -0
  378. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/eg_lift.py +0 -0
  379. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/factor_product.py +0 -0
  380. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/factorize_schub_rc.py +0 -0
  381. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/fast_forest_basis.py +0 -0
  382. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/find_rc_module_relations.py +0 -0
  383. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/find_squash_decomp.py +0 -0
  384. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forest_compute.py +0 -0
  385. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forest_dual_basis_test.py +0 -0
  386. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forest_invariant_cancels.py +0 -0
  387. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forest_rc_transition.py +0 -0
  388. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forforest_rc_prod.py +0 -0
  389. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/formula_for_schub_coeff.py +0 -0
  390. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/forward_rc_prod.py +0 -0
  391. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/full_coprod.py +0 -0
  392. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/generate_equation.py +0 -0
  393. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/generate_rc_product_tikz.py +0 -0
  394. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ghost_equivalence.py +0 -0
  395. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/grass_hw_rule.py +0 -0
  396. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/grasstens_coproduct_hom_to_rc.py +0 -0
  397. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/highest_weights.py +0 -0
  398. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hom_of_coalgebras.py +0 -0
  399. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hpds_run.py +0 -0
  400. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hw_ghost_requivalence.py +0 -0
  401. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hw_ring_weight.py +0 -0
  402. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hw_schub_schur_mul.py +0 -0
  403. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/hw_schub_schur_reduce.py +0 -0
  404. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ideal_decomp.py +0 -0
  405. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/indpull.py +0 -0
  406. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/insertion_monk_same.py +0 -0
  407. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/interactive_rc_graph.py +0 -0
  408. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/investigate_forest_invariant.py +0 -0
  409. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/is_insertion_pieri.py +0 -0
  410. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/is_lowest_weight_trunc_principal.py +0 -0
  411. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/is_principal_hw_subalgebra_positive.py +0 -0
  412. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/is_quasisym.py +0 -0
  413. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/iso_of_rings.py +0 -0
  414. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/jdt_test.py +0 -0
  415. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/jigger_lr.py +0 -0
  416. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/key_dual_basis_test.py +0 -0
  417. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/leibniz_formula.py +0 -0
  418. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/little_bump_viewer.py +0 -0
  419. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/little_map.py +0 -0
  420. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/make_bpds.py +0 -0
  421. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/map_to_poly_ring.py +0 -0
  422. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/maybe_the_coprod.py +0 -0
  423. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/mixed_algebra_hom_test.py +0 -0
  424. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/monk_bpd_squash.py +0 -0
  425. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/monk_crystal.py +0 -0
  426. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/more_claude.py +0 -0
  427. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/mul_tableau_decomp.py +0 -0
  428. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/noncom_cauchy.py +0 -0
  429. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/nr_verification.py +0 -0
  430. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/nsym_rc_graph_test.py +0 -0
  431. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/omega_play.py +0 -0
  432. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/omfg_bimodule.py +0 -0
  433. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/parse_qschub.sage +0 -0
  434. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/parse_qschub.sage.py +0 -0
  435. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/partial_vary.py +0 -0
  436. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/path_to_bpd.py +0 -0
  437. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/pieri_formula_crystal.py +0 -0
  438. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/possible_product_extension.py +0 -0
  439. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/potential_lr_rule.py +0 -0
  440. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/product of.sty +0 -0
  441. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/pull_back_coprod_crystal.py +0 -0
  442. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/pull_pull_test.py +0 -0
  443. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/quasi_monom.py +0 -0
  444. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/quasisym_rc_graph.py +0 -0
  445. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/qy_rc_ring_test.py +0 -0
  446. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_basis_test.py +0 -0
  447. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_bijection_tab.py +0 -0
  448. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_comodule.py +0 -0
  449. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_coprod_test.py +0 -0
  450. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_crystal_iso.py +0 -0
  451. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_schubert_schur_hom.py +0 -0
  452. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rc_transition.py +0 -0
  453. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/real_product.py +0 -0
  454. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/rsk_biject_rc.py +0 -0
  455. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/ruletry.py +0 -0
  456. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/save_this_forever.py +0 -0
  457. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/schub_basis.py +0 -0
  458. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/schub_pairing.py +0 -0
  459. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/schubert_fast_coproduct.py +0 -0
  460. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/schubert_formula_coproduct.py +0 -0
  461. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/simple_fa_rc_coprod.py +0 -0
  462. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/slide_poly.py +0 -0
  463. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/speed_j_pieri.py +0 -0
  464. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/split_it.py +0 -0
  465. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_biject.py +0 -0
  466. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_bpd.py +0 -0
  467. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_cauchy.py +0 -0
  468. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_coproduct.py +0 -0
  469. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/squash_hom_free_algebra.py +0 -0
  470. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/stanley_dual_schub.py +0 -0
  471. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/strip_replacement.py +0 -0
  472. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/tableau_decomp.py +0 -0
  473. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_divdiff_bounded_rc.py +0 -0
  474. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_inverse_crystal_product.py +0 -0
  475. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_schub_well_defined.py +0 -0
  476. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_three_row_product.py +0 -0
  477. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/test_two_row_product.py +0 -0
  478. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/the_LR_rule.py +0 -0
  479. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/the_fk_module.py +0 -0
  480. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/theorem_cauchy.py +0 -0
  481. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/this_is_the_rc_coprod.py +0 -0
  482. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/three_bimod_sanity.py.py +0 -0
  483. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/unique_base_rc_graph.py +0 -0
  484. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/universal_schub_eval.py +0 -0
  485. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/until_pull.py +0 -0
  486. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/verify_report.py +0 -0
  487. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/vex_tree.py +0 -0
  488. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/which_perms_forest.py +0 -0
  489. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/unlinted/which_rcs_ghost.py +0 -0
  490. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/verify_paper_formulas.py +0 -0
  491. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/verify_quantum_triple_positive.py +0 -0
  492. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/_scripts/which_schubs_forest.py +0 -0
  493. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/abc.py +0 -0
  494. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/__init__.py +0 -0
  495. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/anti_rc_graph.py +0 -0
  496. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/bpd.py +0 -0
  497. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/chute_move_element.py +0 -0
  498. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/crystal_graph.py +0 -0
  499. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/double_forest.py +0 -0
  500. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/hecke_plactic.py +0 -0
  501. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/hpd.py +0 -0
  502. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/increasing_tableau.py +0 -0
  503. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/indexed_forests.py +0 -0
  504. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/inversions_tableau.py +0 -0
  505. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/mbpd.py +0 -0
  506. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/nilplactic.py +0 -0
  507. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/permutation.py +0 -0
  508. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/pipe_dream.py +0 -0
  509. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/plactic.py +0 -0
  510. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/planar_history.py +0 -0
  511. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/quasi_crystal_graph.py +0 -0
  512. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/rc_graph.py +0 -0
  513. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/root_tableau.py +0 -0
  514. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/schub_poly.py +0 -0
  515. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/schubert_monomial_graph.py +0 -0
  516. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/set_valued_tableau.py +0 -0
  517. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/set_word.py +0 -0
  518. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/combinatorics/wc_graph.py +0 -0
  519. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/__init__.py +0 -0
  520. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/groth.py +0 -0
  521. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/mult/separated_descents.py +0 -0
  522. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/__init__.py +0 -0
  523. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/__init__.py +0 -0
  524. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/alt_rc_graph_ring.py +0 -0
  525. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/bounded_rc_factor_algebra.py +0 -0
  526. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/bounded_rc_forest_factor_algebra.py +0 -0
  527. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/bounded_wc_factor_algebra.py +0 -0
  528. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/bpd_ring.py +0 -0
  529. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/chute_move_ring.py +0 -0
  530. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/crystal_graph_ring.py +0 -0
  531. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/dual_rc_graph_ring.py +0 -0
  532. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/eg_plactic_ring.py +0 -0
  533. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/eg_ring.py +0 -0
  534. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/forest_invariant_rc_ring.py +0 -0
  535. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/forest_rc_ring.py +0 -0
  536. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/grass_tensor_algebra.py +0 -0
  537. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/grove_wc_ring.py +0 -0
  538. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/hw_rc_ring.py +0 -0
  539. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/key_rc_ring.py +0 -0
  540. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/plactic_algebra.py +0 -0
  541. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/qy_rc_graph_ring.py +0 -0
  542. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/rc_graph_ring.py +0 -0
  543. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/rc_schubert_ring.py +0 -0
  544. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/schubert_monomial_ring.py +0 -0
  545. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/schubert_rc_ring.py +0 -0
  546. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/slide_rc_ring.py +0 -0
  547. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/combinatorial/wc_graph_ring.py +0 -0
  548. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/direct_product_ring.py +0 -0
  549. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/__init__.py +0 -0
  550. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/_core.py +0 -0
  551. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/composition_schubert_basis.py +0 -0
  552. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/elementary_basis.py +0 -0
  553. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/forest_basis.py +0 -0
  554. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/free_algebra_basis.py +0 -0
  555. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/fundamental_slide_basis.py +0 -0
  556. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/glide_basis.py +0 -0
  557. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/grothendieck_basis.py +0 -0
  558. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/grove_basis.py +0 -0
  559. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/j_basis.py +0 -0
  560. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/jt_basis.py +0 -0
  561. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/key_basis.py +0 -0
  562. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/lascoux_basis.py +0 -0
  563. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/monomial_slide_basis.py +0 -0
  564. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/nelementary_basis.py +0 -0
  565. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/schubert_basis.py +0 -0
  566. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/schubert_schur_basis.py +0 -0
  567. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/schur_elementary_basis.py +0 -0
  568. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/separated_descents_basis.py +0 -0
  569. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/word_basis.py +0 -0
  570. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/free_algebra/z_basis.py +0 -0
  571. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/nsym.py +0 -0
  572. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/__init__.py +0 -0
  573. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/_core.py +0 -0
  574. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/anti_schubert_poly_basis.py +0 -0
  575. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/base_polynomial_basis.py +0 -0
  576. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/composition_schubert_poly_basis.py +0 -0
  577. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/double_forest_poly_basis.py +0 -0
  578. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/elem_sym_poly_basis.py +0 -0
  579. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/forest_poly_basis.py +0 -0
  580. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/fundamental_slide_poly_basis.py +0 -0
  581. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/glide_poly_basis.py +0 -0
  582. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/grothendieck_poly_basis.py +0 -0
  583. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/grove_poly_basis.py +0 -0
  584. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/key_poly_basis.py +0 -0
  585. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/lascoux_poly_basis.py +0 -0
  586. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/monomial_basis.py +0 -0
  587. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/monomial_slide_poly_basis.py +0 -0
  588. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/polynomial_basis.py +0 -0
  589. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/schubert_poly_basis.py +0 -0
  590. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/polynomial_algebra/sepdesc_poly_basis.py +0 -0
  591. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/printing.py +0 -0
  592. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/product_ring.py +0 -0
  593. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/quasisymmetric_functions.py +0 -0
  594. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/__init__.py +0 -0
  595. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/beta_coxeter.py +0 -0
  596. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/chevalley.py +0 -0
  597. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/grothendieck_ring.py +0 -0
  598. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/nil_hecke.py +0 -0
  599. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/parabolic_quantum_double_schubert_ring.py +0 -0
  600. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/parabolic_quantum_schubert_ring.py +0 -0
  601. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/schubert/separated_descents.py +0 -0
  602. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/tensor_ring.py +0 -0
  603. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/rings/thompson_algebra.py +0 -0
  604. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/__init__.py +0 -0
  605. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/common_polys.py +0 -0
  606. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/functions.py +0 -0
  607. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/poly/__init__.py +0 -0
  608. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/poly/variables.py +0 -0
  609. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/__init__.py +0 -0
  610. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/complete_sym.py +0 -0
  611. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/elem_sym.py +0 -0
  612. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/functions.py +0 -0
  613. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/symbolic/symmetric_polynomials/qelem_sym.py +0 -0
  614. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/__init__.py +0 -0
  615. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/_grid_print.py +0 -0
  616. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/logging.py +0 -0
  617. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/parsing.py +0 -0
  618. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/perm_utils.py +0 -0
  619. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/schub_lib.py +0 -0
  620. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/utils/tuple_utils.py +0 -0
  621. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult/visualization.py +0 -0
  622. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/dependency_links.txt +0 -0
  623. {schubmult-4.2.0 → schubmult-5.0.0}/src/schubmult.egg-info/top_level.txt +0 -0
  624. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_anti_rc_graph.py +0 -0
  625. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_bpd.py +0 -0
  626. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_indexed_forests.py +0 -0
  627. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_inversions_tableau.py +0 -0
  628. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_mbpd.py +0 -0
  629. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_nilplactic.py +0 -0
  630. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_permutation_order.py +0 -0
  631. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_pipe_dream.py +0 -0
  632. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_rc_graph.py +0 -0
  633. {schubmult-4.2.0 → schubmult-5.0.0}/tests/combinatorics/test_wc_graph.py +0 -0
  634. {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_combinatorial.py +0 -0
  635. {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_duality.py +0 -0
  636. {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_forest_rc_ring.py +0 -0
  637. {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_free_algebra.py +0 -0
  638. {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_parabolic_quantum_ring.py +0 -0
  639. {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_polynomial_algebra.py +0 -0
  640. {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_public_imports.py +0 -0
  641. {schubmult-4.2.0 → schubmult-5.0.0}/tests/rings/test_schubert_rings.py +0 -0
  642. {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/_cmd_line_json.py +0 -0
  643. {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
  644. {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
  645. {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
  646. {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
  647. {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
  648. {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
  649. {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/data/schubmult_q/schubmult_q_code_2_0_5T3_0_2.json +0 -0
  650. {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
  651. {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
  652. {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
  653. {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
  654. {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
  655. {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/test_schubmult_double.py +0 -0
  656. {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/test_schubmult_py.py +0 -0
  657. {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/test_schubmult_q.py +0 -0
  658. {schubmult-4.2.0 → schubmult-5.0.0}/tests/scripts/test_schubmult_q_double.py +0 -0
  659. {schubmult-4.2.0 → schubmult-5.0.0}/tests/test_api_surface.py +0 -0
  660. {schubmult-4.2.0 → schubmult-5.0.0}/web/README.md +0 -0
  661. {schubmult-4.2.0 → schubmult-5.0.0}/web/templates/index.html +0 -0
  662. {schubmult-4.2.0 → schubmult-5.0.0}/wordpress-plugin/README.md +0 -0
  663. {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: 4.2.0
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
- Requires-Python: >=3.9
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>=2.7.0
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
+ }