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.
- schubmult/__init__.py +96 -1
- schubmult/perm_lib.py +254 -819
- schubmult/poly_lib/__init__.py +31 -0
- schubmult/poly_lib/poly_lib.py +276 -0
- schubmult/poly_lib/schub_poly.py +148 -0
- schubmult/poly_lib/variables.py +204 -0
- schubmult/rings/__init__.py +18 -0
- schubmult/rings/_quantum_schubert_polynomial_ring.py +752 -0
- schubmult/rings/_schubert_polynomial_ring.py +1031 -0
- schubmult/rings/_tensor_schub_ring.py +128 -0
- schubmult/rings/_utils.py +55 -0
- schubmult/{sage_integration → sage}/__init__.py +4 -1
- schubmult/{sage_integration → sage}/_fast_double_schubert_polynomial_ring.py +67 -109
- schubmult/{sage_integration → sage}/_fast_schubert_polynomial_ring.py +33 -28
- schubmult/{sage_integration → sage}/_indexing.py +9 -5
- schubmult/schub_lib/__init__.py +51 -0
- schubmult/{schubmult_double/_funcs.py → schub_lib/double.py} +532 -596
- schubmult/{schubmult_q/_funcs.py → schub_lib/quantum.py} +54 -53
- schubmult/schub_lib/quantum_double.py +954 -0
- schubmult/schub_lib/schub_lib.py +659 -0
- schubmult/{schubmult_py/_funcs.py → schub_lib/single.py} +45 -35
- schubmult/schub_lib/tests/__init__.py +0 -0
- schubmult/schub_lib/tests/legacy_perm_lib.py +946 -0
- schubmult/schub_lib/tests/test_vs_old.py +109 -0
- schubmult/scripts/__init__.py +0 -0
- schubmult/scripts/schubmult_double.py +378 -0
- schubmult/scripts/schubmult_py.py +84 -0
- schubmult/scripts/schubmult_q.py +109 -0
- schubmult/scripts/schubmult_q_double.py +207 -0
- schubmult/utils/__init__.py +0 -0
- schubmult/{_base_argparse.py → utils/argparse.py} +29 -5
- schubmult/utils/logging.py +16 -0
- schubmult/utils/parsing.py +20 -0
- schubmult/utils/perm_utils.py +135 -0
- schubmult/utils/test_utils.py +65 -0
- schubmult-3.0.1.dist-info/METADATA +1234 -0
- schubmult-3.0.1.dist-info/RECORD +41 -0
- {schubmult-2.0.4.dist-info → schubmult-3.0.1.dist-info}/WHEEL +1 -1
- schubmult-3.0.1.dist-info/entry_points.txt +5 -0
- schubmult/_tests.py +0 -24
- schubmult/schubmult_double/__init__.py +0 -12
- schubmult/schubmult_double/__main__.py +0 -6
- schubmult/schubmult_double/_script.py +0 -474
- schubmult/schubmult_py/__init__.py +0 -12
- schubmult/schubmult_py/__main__.py +0 -6
- schubmult/schubmult_py/_script.py +0 -97
- schubmult/schubmult_q/__init__.py +0 -8
- schubmult/schubmult_q/__main__.py +0 -6
- schubmult/schubmult_q/_script.py +0 -166
- schubmult/schubmult_q_double/__init__.py +0 -10
- schubmult/schubmult_q_double/__main__.py +0 -6
- schubmult/schubmult_q_double/_funcs.py +0 -540
- schubmult/schubmult_q_double/_script.py +0 -396
- schubmult-2.0.4.dist-info/METADATA +0 -542
- schubmult-2.0.4.dist-info/RECORD +0 -30
- schubmult-2.0.4.dist-info/entry_points.txt +0 -5
- {schubmult-2.0.4.dist-info → schubmult-3.0.1.dist-info}/licenses/LICENSE +0 -0
- {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,,
|
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,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,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))
|