schubmult 2.0.4__py3-none-any.whl → 3.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. schubmult/__init__.py +96 -1
  2. schubmult/perm_lib.py +254 -819
  3. schubmult/poly_lib/__init__.py +31 -0
  4. schubmult/poly_lib/poly_lib.py +276 -0
  5. schubmult/poly_lib/schub_poly.py +148 -0
  6. schubmult/poly_lib/variables.py +204 -0
  7. schubmult/rings/__init__.py +18 -0
  8. schubmult/rings/_quantum_schubert_polynomial_ring.py +752 -0
  9. schubmult/rings/_schubert_polynomial_ring.py +1031 -0
  10. schubmult/rings/_tensor_schub_ring.py +128 -0
  11. schubmult/rings/_utils.py +55 -0
  12. schubmult/{sage_integration → sage}/__init__.py +4 -1
  13. schubmult/{sage_integration → sage}/_fast_double_schubert_polynomial_ring.py +67 -109
  14. schubmult/{sage_integration → sage}/_fast_schubert_polynomial_ring.py +33 -28
  15. schubmult/{sage_integration → sage}/_indexing.py +9 -5
  16. schubmult/schub_lib/__init__.py +51 -0
  17. schubmult/{schubmult_double/_funcs.py → schub_lib/double.py} +532 -596
  18. schubmult/{schubmult_q/_funcs.py → schub_lib/quantum.py} +54 -53
  19. schubmult/schub_lib/quantum_double.py +954 -0
  20. schubmult/schub_lib/schub_lib.py +659 -0
  21. schubmult/{schubmult_py/_funcs.py → schub_lib/single.py} +45 -35
  22. schubmult/schub_lib/tests/__init__.py +0 -0
  23. schubmult/schub_lib/tests/legacy_perm_lib.py +946 -0
  24. schubmult/schub_lib/tests/test_vs_old.py +109 -0
  25. schubmult/scripts/__init__.py +0 -0
  26. schubmult/scripts/schubmult_double.py +378 -0
  27. schubmult/scripts/schubmult_py.py +84 -0
  28. schubmult/scripts/schubmult_q.py +109 -0
  29. schubmult/scripts/schubmult_q_double.py +207 -0
  30. schubmult/utils/__init__.py +0 -0
  31. schubmult/{_base_argparse.py → utils/argparse.py} +29 -5
  32. schubmult/utils/logging.py +16 -0
  33. schubmult/utils/parsing.py +20 -0
  34. schubmult/utils/perm_utils.py +135 -0
  35. schubmult/utils/test_utils.py +65 -0
  36. schubmult-3.0.1.dist-info/METADATA +1234 -0
  37. schubmult-3.0.1.dist-info/RECORD +41 -0
  38. {schubmult-2.0.4.dist-info → schubmult-3.0.1.dist-info}/WHEEL +1 -1
  39. schubmult-3.0.1.dist-info/entry_points.txt +5 -0
  40. schubmult/_tests.py +0 -24
  41. schubmult/schubmult_double/__init__.py +0 -12
  42. schubmult/schubmult_double/__main__.py +0 -6
  43. schubmult/schubmult_double/_script.py +0 -474
  44. schubmult/schubmult_py/__init__.py +0 -12
  45. schubmult/schubmult_py/__main__.py +0 -6
  46. schubmult/schubmult_py/_script.py +0 -97
  47. schubmult/schubmult_q/__init__.py +0 -8
  48. schubmult/schubmult_q/__main__.py +0 -6
  49. schubmult/schubmult_q/_script.py +0 -166
  50. schubmult/schubmult_q_double/__init__.py +0 -10
  51. schubmult/schubmult_q_double/__main__.py +0 -6
  52. schubmult/schubmult_q_double/_funcs.py +0 -540
  53. schubmult/schubmult_q_double/_script.py +0 -396
  54. schubmult-2.0.4.dist-info/METADATA +0 -542
  55. schubmult-2.0.4.dist-info/RECORD +0 -30
  56. schubmult-2.0.4.dist-info/entry_points.txt +0 -5
  57. {schubmult-2.0.4.dist-info → schubmult-3.0.1.dist-info}/licenses/LICENSE +0 -0
  58. {schubmult-2.0.4.dist-info → schubmult-3.0.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,41 @@
1
+ schubmult/__init__.py,sha256=SqufaRbFLZue-oOMqDUpEVJagcTJoAi5XY5Az_YC1bw,2385
2
+ schubmult/perm_lib.py,sha256=2yUV3nquNnGPLpAJJBCg7SFF-y-eP0zcCxC9hy6keDg,10431
3
+ schubmult/poly_lib/__init__.py,sha256=DUA70oCWv64lqhezrpKgA6813Dp5LTM1bkMrpOoqjTU,674
4
+ schubmult/poly_lib/poly_lib.py,sha256=ZgZWY9Q2TBdk5lH2Jtg7LJO-WETtVcYfr8aSpaEKdMU,7839
5
+ schubmult/poly_lib/schub_poly.py,sha256=_GXApXSbmlF0neSZOY9fCFXxSmYJEoHv_PvJJzIhy5E,4586
6
+ schubmult/poly_lib/variables.py,sha256=cnR9Kvzbh7LA0Mvi292h2eMW7d3s2GU9DKvP3M44HNE,6005
7
+ schubmult/rings/__init__.py,sha256=Xaf8JB64C0tjlb_F8WQqHFGp3MM5LteFgkxNETImMiU,630
8
+ schubmult/rings/_quantum_schubert_polynomial_ring.py,sha256=H71XoK96-Bfel-uel5BPQLIL_Kazjjej3StgXeDBAd0,29951
9
+ schubmult/rings/_schubert_polynomial_ring.py,sha256=mokenMrZJq0nrzV8xZ23xrIQJTYpFdbUCCct1vpIbCE,39338
10
+ schubmult/rings/_tensor_schub_ring.py,sha256=-ahCinjsAyK6EvfPD8T4nB4KJ8syISEbtYL-n34q16I,3952
11
+ schubmult/rings/_utils.py,sha256=hCB9sMJfgINLvqbJbpGd5bnGQL3sb6G1nr1Dr5O-qwM,1787
12
+ schubmult/sage/__init__.py,sha256=bgRIEllThsrH0kYJnEAR_cirTGGfdPojOUajbZjJhq4,906
13
+ schubmult/sage/_fast_double_schubert_polynomial_ring.py,sha256=pAan4EWSss0rQA2Pk_QuqGTuy4SoxAGFzaVZGQJAzS0,19936
14
+ schubmult/sage/_fast_schubert_polynomial_ring.py,sha256=dXLX-9rfpk_ueIRqDcGRc83oWx45gaf1SNAbp4ALliY,14371
15
+ schubmult/sage/_indexing.py,sha256=L6ShyDI7ceMSga8jel5mzAWBxfmsXC9uJZYpZ_WrnOI,1932
16
+ schubmult/schub_lib/__init__.py,sha256=kFtT2ghMrgFACzJSraeJYGcvGlb3uXt_GJIl36tmOw8,1118
17
+ schubmult/schub_lib/double.py,sha256=x7l84DJ4e0VW90z7GbdRNpF7FUcKGPXhXWOxBLXBLh0,51663
18
+ schubmult/schub_lib/quantum.py,sha256=RcjpAtyxVndo-kR-H31gjtmjaLNq2PWSglvw6LnKOR0,9998
19
+ schubmult/schub_lib/quantum_double.py,sha256=Ex4Azr-aPGLajFcuOFFNCBKYrDt7fcp7lc_B9SOhGbE,36774
20
+ schubmult/schub_lib/schub_lib.py,sha256=Sca_PAOD0ABEyixpgYpFxPxfCPZnKchFGeKUZIstIyc,22815
21
+ schubmult/schub_lib/single.py,sha256=3ZJzC9dSFc6Ux_DcuSKekwK7D9ZyrCd5OUEiIKW8LZk,5210
22
+ schubmult/schub_lib/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ schubmult/schub_lib/tests/legacy_perm_lib.py,sha256=fMGkKPv6VtZcTBFC5JZsZQRy1-m9a2uvOGmCiF-eovM,29619
24
+ schubmult/schub_lib/tests/test_vs_old.py,sha256=6X1GDj3dCRg3Hx6rFOUk4trIv7I2Hctq6FlUwGH3gHk,4362
25
+ schubmult/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ schubmult/scripts/schubmult_double.py,sha256=DGGH_DQDcovAi5TcJ2_bnA0Slj9-pB3tSVh3pr6SIZM,13010
27
+ schubmult/scripts/schubmult_py.py,sha256=ARQn4Ucl5n8dz_q77gjkrazVSDjUMQHkx5EK7Sx5_Wc,2738
28
+ schubmult/scripts/schubmult_q.py,sha256=ntzcVmFjRbXGKTddkhdNVpxcMTTtK4CeOI4BeIVjePQ,3287
29
+ schubmult/scripts/schubmult_q_double.py,sha256=SANQEvlA5XJUWUh8sd_ObwMOEmct0GLSMbjDAvUTOB4,6086
30
+ schubmult/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ schubmult/utils/argparse.py,sha256=ZY85ZR-h8TOUQuzTVlvRfh07QQ032B3c649rLYZHrp8,7205
32
+ schubmult/utils/logging.py,sha256=h-CgHSl7kPscs9VKp0WjJ4fcrtPplnJYDyrL2klPJJ4,503
33
+ schubmult/utils/parsing.py,sha256=ygkkLqZ1KsNQBPeiF6gkEJYMwjmkqkwfGuIP0Wtawnk,599
34
+ schubmult/utils/perm_utils.py,sha256=mf5VOwLREn_UQWMa67lOsmmwHMJClt_rjsVPIE2yE9w,2716
35
+ schubmult/utils/test_utils.py,sha256=vEIuAkb-mFEs1gow9E76JrRbcEDvxvsTDzp4pPUoT5w,1860
36
+ schubmult-3.0.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
37
+ schubmult-3.0.1.dist-info/METADATA,sha256=ZOHi7RDDLffv5Xnq9FUQfua55DxflmWoNB3O6CsjVPk,77074
38
+ schubmult-3.0.1.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
39
+ schubmult-3.0.1.dist-info/entry_points.txt,sha256=9iaFSlTd5xZf52635CKaBqmgJTY_NZLkF6AMnL_T84c,240
40
+ schubmult-3.0.1.dist-info/top_level.txt,sha256=IkujyjRu8lbpoSTdPE8DmMJ9sbyXHpo9L0RHL7nOzM0,10
41
+ schubmult-3.0.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.0.2)
2
+ Generator: setuptools (79.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,5 @@
1
+ [console_scripts]
2
+ schubmult_double = schubmult.scripts.schubmult_double:main
3
+ schubmult_py = schubmult.scripts.schubmult_py:main
4
+ schubmult_q = schubmult.scripts.schubmult_q:main
5
+ schubmult_q_double = schubmult.scripts.schubmult_q_double:main
schubmult/_tests.py DELETED
@@ -1,24 +0,0 @@
1
-
2
- def get_json(file: str):
3
- import json
4
- import os
5
-
6
- script_dir = os.path.dirname(__file__)
7
- rel_path = f"../tests/script_tests/data/{file}.json"
8
- abs_file_path = os.path.join(script_dir, rel_path)
9
- with open(abs_file_path) as f:
10
- return json.load(f)
11
-
12
-
13
- def load_json_test_names(this_dir):
14
- import os
15
- script_dir = os.path.dirname(__file__)
16
- rel_path = f"../tests/script_tests/data/{this_dir}"
17
- abs_path = os.path.join(script_dir, rel_path)
18
- files = os.listdir(abs_path)
19
- ret = []
20
- for file in files:
21
- index = file.rfind(".json")
22
- filename = file[:index]
23
- ret += [filename]
24
- return ret
@@ -1,12 +0,0 @@
1
- from ._funcs import compute_positive_rep, div_diff, mult_poly, posify, schub_coprod, schubmult, single_variable
2
-
3
- __all__ = [
4
- "compute_positive_rep",
5
- "div_diff",
6
- "main",
7
- "mult_poly",
8
- "posify",
9
- "schub_coprod",
10
- "schubmult",
11
- "single_variable",
12
- ]
@@ -1,6 +0,0 @@
1
- import sys
2
-
3
- from ._script import main
4
-
5
- if __name__ == "__main__":
6
- sys.exit(main(sys.argv))
@@ -1,474 +0,0 @@
1
- import sys
2
- from functools import cached_property
3
-
4
- import numpy as np
5
- import sympy
6
- from symengine import expand, symarray, sympify
7
-
8
- from schubmult._base_argparse import schub_argparse
9
- from schubmult.perm_lib import (
10
- add_perm_dict,
11
- code,
12
- inv,
13
- inverse,
14
- mu_A,
15
- mulperm,
16
- permtrim,
17
- theta,
18
- trimcode,
19
- uncode,
20
- will_formula_work,
21
- )
22
-
23
- # from schubmult.schubmult_double._vars import var_x, var, var_r
24
- from schubmult.schubmult_double._funcs import (
25
- compute_positive_rep,
26
- mult_poly,
27
- mult_poly_down,
28
- posify,
29
- schubmult,
30
- schubmult_down,
31
- split_perms,
32
- )
33
-
34
-
35
- class _gvars:
36
- @cached_property
37
- def n(self):
38
- return 100
39
-
40
- # @cached_property
41
- # def fvar(self):
42
- # return 100
43
-
44
- @cached_property
45
- def var1(self):
46
- return tuple(symarray("x", self.n).tolist())
47
-
48
- @cached_property
49
- def var2(self):
50
- return tuple(symarray("y", self.n).tolist())
51
-
52
- @cached_property
53
- def var3(self):
54
- return tuple(symarray("z", self.n).tolist())
55
-
56
- @cached_property
57
- def var_r(self):
58
- return symarray("r", 100)
59
-
60
-
61
- _vars = _gvars()
62
-
63
-
64
- def _display(val):
65
- print(val)
66
-
67
-
68
- def _display_full(
69
- coeff_dict,
70
- args,
71
- formatter,
72
- var2,
73
- var3,
74
- posified=None,
75
- check_coeff_dict=None,
76
- kperm=None,
77
- N=None,
78
- ):
79
- subs_dict2 = {}
80
- for i in range(1, 100):
81
- sm = var2[1]
82
- for j in range(1, i):
83
- sm += _vars.var_r[j]
84
- subs_dict2[var2[i]] = sm
85
- raw_result_dict = {}
86
- perms = args.perms
87
- mult = args.mult
88
- ascode = args.ascode
89
- coprod = args.coprod
90
- check = args.check
91
- msg = args.msg
92
- down = args.down
93
- same = args.same
94
- display_positive = args.display_positive
95
-
96
- coeff_perms = list(coeff_dict.keys())
97
- if coprod:
98
- pos = perms[1]
99
- pos2 = []
100
- last_descent = -1
101
- poso = []
102
- for i in range(len(perms[0]) - 1):
103
- if perms[0][i] > perms[0][i + 1]:
104
- last_descent = i + 1
105
- for i in range(1, last_descent + 1):
106
- if i not in pos:
107
- pos2 += [i - 1]
108
- else:
109
- poso += [i - 1]
110
-
111
- mu_W = uncode(theta(inverse(perms[0])))
112
-
113
- the_top_perm = tuple(permtrim(mulperm(list(perms[0]), mu_W)))
114
-
115
- muA = uncode(mu_A(code(mu_W), poso))
116
- muB = uncode(mu_A(code(mu_W), pos2))
117
- subs_dict = {}
118
- inv_kperm = inv(kperm)
119
- inverse_kperm = inverse(kperm)
120
- var2neg = np.array([-var2[i] for i in range(len(var2))])
121
- var3neg = np.array([-var3[i] for i in range(len(var3))])
122
-
123
- for i in range(1, 100):
124
- if i <= N:
125
- subs_dict[_vars.var1[i]] = var2[i]
126
- else:
127
- subs_dict[_vars.var1[i]] = var3[i - N]
128
-
129
- coeff_perms.sort(key=lambda x: (inv(x), *x))
130
-
131
- perm_pairs = []
132
-
133
- for perm in coeff_perms:
134
- downperm = mulperm(list(perm), inverse_kperm)
135
- if inv(downperm) == inv(perm) - inv_kperm:
136
- flag = True
137
- for i in range(N):
138
- if downperm[i] > N:
139
- flag = False
140
- break
141
- if not flag:
142
- continue
143
- firstperm = downperm[0:N]
144
- secondperm = [downperm[i] - N for i in range(N, len(downperm))]
145
- perm_pairs += [[permtrim(firstperm), permtrim(secondperm)]]
146
-
147
- if ascode:
148
- width = max(
149
- [len(str(trimcode(perm[0])) + " " + str(trimcode(perm[1]))) for perm in perm_pairs],
150
- )
151
- else:
152
- width = max([len(str(perm[0]) + " " + str(perm[1])) for perm in perm_pairs])
153
-
154
-
155
- for perm in coeff_perms:
156
- val = coeff_dict[perm]
157
- downperm = mulperm(list(perm), inverse_kperm)
158
- if inv(downperm) == inv(perm) - inv_kperm:
159
- flag = True
160
- for i in range(N):
161
- if downperm[i] > N:
162
- flag = False
163
- break
164
- if not flag:
165
- continue
166
- firstperm = downperm[0:N]
167
- secondperm = [downperm[i] - N for i in range(N, len(downperm))]
168
- val = sympify(val).subs(subs_dict)
169
-
170
- if same and display_positive:
171
- val = expand(sympify(val).subs(subs_dict2))
172
-
173
- if val != 0:
174
- if display_positive and not same:
175
- if val != 0:
176
- val2 = posify(
177
- val,
178
- tuple(permtrim(mulperm(firstperm, muA))),
179
- tuple(permtrim(mulperm(secondperm, muB))),
180
- the_top_perm,
181
- tuple(var2neg.tolist()),
182
- tuple(var3neg.tolist()),
183
- msg,
184
- False,
185
- )
186
- if expand(val - val2) != 0:
187
- _display(
188
- f"error; write to schubmult@gmail.com with the case {perms=}\n{code(firstperm)=} {code(secondperm)=}\n{val2=}\n{val=}",
189
- )
190
- _display(
191
- f"{code(tuple(permtrim(mulperm(firstperm,muA))))=},{code(tuple(permtrim(mulperm(secondperm,muB))))=},{code(the_top_perm)=}\n{expand(val-val2)=}",
192
- )
193
- exit(1)
194
- val = val2
195
- else:
196
- val = 0
197
- if val != 0:
198
- if not ascode:
199
- width2 = (
200
- width
201
- - len(str(permtrim(firstperm)))
202
- - len(str(permtrim(secondperm)))
203
- )
204
- raw_result_dict[
205
- (tuple(permtrim(firstperm)), tuple(permtrim(secondperm)))
206
- ] = val
207
- if formatter:
208
- _display(
209
- f"{tuple(permtrim(firstperm))}{' ':>{width2}}{tuple(permtrim(secondperm))} {formatter(val)}",
210
- )
211
- else:
212
- width2 = (
213
- width
214
- - len(str(trimcode(firstperm)))
215
- - len(str(trimcode(secondperm)))
216
- )
217
- raw_result_dict[
218
- (tuple(trimcode(firstperm)), tuple(trimcode(secondperm)))
219
- ] = val
220
- if formatter:
221
- _display(
222
- f"{trimcode(firstperm)}{' ':>{width2}}{trimcode(secondperm)} {formatter(val)}",
223
- )
224
- else:
225
- if ascode:
226
- width = max([len(str(trimcode(perm))) for perm in coeff_dict.keys()])
227
- else:
228
- width = max([len(str(perm)) for perm in coeff_dict.keys()])
229
-
230
- coeff_perms = list(coeff_dict.keys())
231
- coeff_perms.sort(key=lambda x: (inv(x), *x))
232
-
233
- for perm in coeff_perms:
234
- val = coeff_dict[perm]
235
- if val != 0:
236
- notint = False
237
- try:
238
- int(val)
239
- except Exception:
240
- notint = True
241
- if notint and display_positive:
242
- if same:
243
- subs_dict = {}
244
- for i in range(1, 100):
245
- sm = var2[1]
246
- for j in range(1, i):
247
- sm += _vars.var_r[j]
248
- subs_dict[var2[i]] = sm
249
- val = expand(sympify(coeff_dict[perm]).xreplace(subs_dict))
250
- else:
251
- try:
252
- if len(perms) == 2 and not posified and not mult:
253
- if not down:
254
- val = posify(
255
- val,
256
- perms[0],
257
- perms[1],
258
- perm,
259
- var2,
260
- var3,
261
- msg,
262
- )
263
- else:
264
- val = posify(
265
- val,
266
- perm,
267
- perms[1],
268
- perms[0],
269
- var2,
270
- var3,
271
- msg,
272
- )
273
- elif not posified and not mult:
274
- val = compute_positive_rep(val, var2, var3, msg)
275
- elif not posified:
276
- val = compute_positive_rep(val, var2, var3, msg, do_pos_neg=False)
277
- except Exception:
278
- if mult:
279
- _display(
280
- "warning; --display-positive is on but result is not positive",
281
- file=sys.stderr,
282
- )
283
- else:
284
- _display(
285
- f"error; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {check_coeff_dict.get(perm,0)=}",
286
- )
287
- exit(1)
288
- if check and expand(val - check_coeff_dict.get(perm, 0)) != 0:
289
- _display(
290
- f"error; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {check_coeff_dict.get(perm,0)=}",
291
- )
292
- exit(1)
293
- if val != 0:
294
- if ascode:
295
- raw_result_dict[tuple(trimcode(perm))] = val
296
- if formatter:
297
- _display(f"{trimcode(perm)!s:>{width}} {formatter(val)}")
298
- else:
299
- raw_result_dict[tuple(perm)] = val
300
- if formatter:
301
- _display(f"{perm!s:>{width}} {formatter(val)}")
302
- return raw_result_dict
303
-
304
-
305
- def main(argv=None):
306
- if argv is None:
307
- argv = sys.argv
308
-
309
- try:
310
- var2 = tuple(symarray("y", 100).tolist())
311
- var3 = tuple(symarray("z", 100).tolist())
312
- sys.setrecursionlimit(1000000)
313
-
314
- # TEMP
315
- sympy.init_printing()
316
-
317
- args, formatter = schub_argparse(
318
- "schubmult_double",
319
- "Compute coefficients of product of double Schubert polynomials in the same or different sets of coefficient variables",
320
- argv=argv[1:],
321
- yz=True,
322
- )
323
-
324
- mult = args.mult
325
- mulstring = args.mulstring
326
-
327
- perms = args.perms
328
-
329
- ascode = args.ascode
330
- coprod = args.coprod
331
- same = args.same
332
- msg = args.msg
333
- down = args.down
334
- display_positive = args.display_positive
335
- pr = args.pr
336
-
337
- # logger.log(logging.DEBUG, f"main boing 1 {var2=}{var3=}{same=}")
338
- if same:
339
- # logger.log(logging.DEBUG, f"main OOO {same=}")
340
- var3 = var2
341
- # logger.log(logging.DEBUG, f"main boing 2 {var2=}{var3=}{same=}")
342
- posified = False
343
- if coprod:
344
- if ascode:
345
- mperm = tuple(permtrim(uncode(perms[0])))
346
- else:
347
- mperm = tuple(permtrim(perms[0]))
348
-
349
- perms[0] = mperm
350
- pos = perms[1]
351
-
352
- k = len(pos)
353
- n = len(perms[0])
354
- kcd = [pos[i] - i - 1 for i in range(len(pos))] + [n + 1 - k for i in range(k, n)]
355
- N = len(kcd)
356
-
357
- kperm = inverse(uncode(kcd))
358
- coeff_dict = {tuple(kperm): 1}
359
- coeff_dict = schubmult(coeff_dict, perms[0], _vars.var1, var2)
360
-
361
- if pr or formatter is None:
362
- # logger.log(logging.DEBUG, f"main {var2=}{var3=}{same=}")
363
- raw_result_dict = _display_full(
364
- coeff_dict,
365
- args,
366
- formatter,
367
- posified=posified,
368
- kperm=kperm,
369
- var2=var2,
370
- var3=var3,
371
- N=N,
372
- )
373
- if formatter is None:
374
- return raw_result_dict
375
- else:
376
- if ascode:
377
- for i in range(len(perms)):
378
- perms[i] = tuple(permtrim(uncode(perms[i])))
379
- else:
380
- for i in range(len(perms)):
381
- if len(perms[i]) < 2 and (len(perms[i]) == 0 or perms[i][0] == 1):
382
- perms[i] = (1, 2)
383
- perms[i] = tuple(permtrim([*perms[i]]))
384
-
385
- size = 0
386
- orig_perms = [*perms]
387
- while len(perms) != size:
388
- size = len(perms)
389
- perms = split_perms(perms)
390
-
391
- coeff_dict = {perms[0]: 1}
392
- check_coeff_dict = {perms[0]: 1}
393
-
394
- # if mult:
395
- # for v in var2:
396
- # ()[str(v)] = v
397
- # for v in var3:
398
- # globals()[str(v)] = v
399
- # for v in _vars.var1:
400
- # globals()[str(v)] = v
401
-
402
- if down:
403
- for perm in orig_perms[1:]:
404
- check_coeff_dict = schubmult_down(check_coeff_dict, perm, var2, var3)
405
- if mult:
406
- mul_exp = eval(mulstring)
407
- check_coeff_dict = mult_poly_down(check_coeff_dict, mul_exp)
408
- else:
409
- for perm in orig_perms[1:]:
410
- check_coeff_dict = schubmult(check_coeff_dict, perm, var2, var3)
411
- # coeff_dict = check_coeff_dict
412
- if mult:
413
- mul_exp = eval(mulstring)
414
- check_coeff_dict = mult_poly(check_coeff_dict, mul_exp)
415
-
416
- if (
417
- display_positive
418
- and len(perms) == 2
419
- and will_formula_work(perms[0], perms[1])
420
- and not mult
421
- and not down
422
- and not same
423
- ):
424
- coeff_dict = {}
425
- th = theta(perms[1])
426
- muv = uncode(th)
427
- muvn1v = mulperm(inverse(muv), perms[1])
428
- coeff_dict2 = {perms[0]: 1}
429
- coeff_dict2 = schubmult(coeff_dict2, muv, var2, var3)
430
- for perm, val in coeff_dict2.items():
431
- w = mulperm([*perm], muvn1v)
432
- if inv(w) + inv(muvn1v) == inv(perm):
433
- coeff_dict[tuple(permtrim(w))] = val
434
- posified = True
435
-
436
- if display_positive and len(perms) > 2 and not mult and not same:
437
- coeff_dict2 = dict(coeff_dict)
438
- for perm in perms[1:]:
439
- coeff_dict3 = {}
440
- for u in coeff_dict2:
441
- coeff_dict4 = {u: 1}
442
- coeff_dict4 = schubmult(coeff_dict4, perm, var2, var3)
443
- for w in coeff_dict4:
444
- coeff_dict4[w] = coeff_dict2[u] * posify(
445
- coeff_dict4[w], u, perm, w, var2, var3, msg,
446
- )
447
- coeff_dict3 = add_perm_dict(coeff_dict4, coeff_dict3)
448
- coeff_dict2 = coeff_dict3
449
- coeff_dict = coeff_dict2
450
- posified = True
451
- elif not posified:
452
- coeff_dict = check_coeff_dict
453
-
454
-
455
- if pr or formatter is None:
456
- raw_result_dict = _display_full(
457
- coeff_dict,
458
- args,
459
- formatter,
460
- var2,
461
- var3,
462
- posified=posified,
463
- check_coeff_dict=check_coeff_dict,
464
- )
465
-
466
- if formatter is None:
467
- return raw_result_dict
468
- except BrokenPipeError:
469
- pass
470
- return 0
471
-
472
-
473
- if __name__ == "__main__":
474
- sys.exit(main(sys.argv))
@@ -1,12 +0,0 @@
1
- from ._funcs import (
2
- mult_poly,
3
- schub_coprod,
4
- schubmult,
5
- )
6
-
7
- __all__ = [
8
- "mult_poly",
9
- "schub_coprod",
10
- "schubmult",
11
- ]
12
-
@@ -1,6 +0,0 @@
1
- import sys
2
-
3
- from ._script import main
4
-
5
- if __name__ == "__main__":
6
- sys.exit(main(sys.argv))
@@ -1,97 +0,0 @@
1
- import sys
2
-
3
- from symengine import sympify
4
-
5
- from schubmult._base_argparse import schub_argparse
6
- from schubmult.perm_lib import (
7
- inv,
8
- inverse,
9
- permtrim,
10
- theta,
11
- trimcode,
12
- uncode,
13
- )
14
- from schubmult.schubmult_py._funcs import mult_poly, schub_coprod, schubmult
15
-
16
-
17
- def main(argv=None):
18
- if argv is None:
19
- argv = sys.argv
20
- try:
21
- args, formatter = schub_argparse(
22
- "schubmult_py", "Compute products of ordinary Schubert polynomials", argv=argv[1:],
23
- )
24
-
25
- mult = args.mult
26
- mulstring = args.mulstring
27
-
28
- perms = args.perms
29
-
30
- for perm in perms:
31
- try:
32
- for i in range(len(perm)):
33
- perm[i] = int(perm[i])
34
- except Exception as e:
35
- print("Permutations must have integer values")
36
- raise e
37
-
38
- ascode = args.ascode
39
- pr = args.pr
40
- coprod = args.coprod
41
- raw_result_dict = {}
42
- if coprod:
43
- if ascode:
44
- perms[0] = tuple(permtrim(uncode(perms[0])))
45
- pos = [*perms[1]]
46
- pos.sort()
47
- mperm = tuple(permtrim(perms[0]))
48
-
49
- coeff_dict = schub_coprod(mperm, pos)
50
-
51
- if pr or formatter is None:
52
- for firstperm, secondperm in coeff_dict:
53
- val = coeff_dict[(firstperm, secondperm)]
54
- if val != 0:
55
- if ascode:
56
- if formatter is None:
57
- raw_result_dict[(tuple(trimcode(firstperm)), tuple(trimcode(secondperm)))] = val
58
- else:
59
- print(f"{val} {trimcode(firstperm)} {trimcode(secondperm)}")
60
- elif formatter is None:
61
- raw_result_dict[(firstperm, secondperm)] = val
62
- else:
63
- print(f"{val} {firstperm} {secondperm}")
64
- else:
65
- if ascode:
66
- for i in range(len(perms)):
67
- perms[i] = tuple(permtrim(uncode(perms[i])))
68
-
69
- perms.sort(reverse=True, key=lambda x: sum(theta(inverse(x))) - inv(x))
70
-
71
- coeff_dict = {tuple(permtrim([*perms[0]])): 1}
72
-
73
- for perm in perms[1:]:
74
- coeff_dict = schubmult(coeff_dict, tuple(permtrim([*perm])))
75
- if mult:
76
- mul_exp = sympify(mulstring)
77
- coeff_dict = mult_poly(coeff_dict, mul_exp)
78
-
79
- if pr or formatter is None:
80
- for perm, val in coeff_dict.items():
81
- if val != 0:
82
- if ascode:
83
- raw_result_dict[tuple(trimcode(perm))] = val
84
- if formatter:
85
- print(f"{val} {trimcode(perm)}")
86
- else:
87
- raw_result_dict[tuple(perm)] = val
88
- if formatter:
89
- print(f"{val} {perm}")
90
- if formatter is None:
91
- return raw_result_dict
92
- except BrokenPipeError:
93
- pass
94
-
95
-
96
- if __name__ == "__main__":
97
- sys.exit(main(sys.argv))