schubmult 2.0.2__py3-none-any.whl → 2.0.4__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 +1 -1
- schubmult/_base_argparse.py +42 -8
- schubmult/_tests.py +24 -0
- schubmult/perm_lib.py +52 -112
- schubmult/sage_integration/__init__.py +13 -13
- schubmult/sage_integration/_fast_double_schubert_polynomial_ring.py +139 -118
- schubmult/sage_integration/_fast_schubert_polynomial_ring.py +88 -49
- schubmult/sage_integration/_indexing.py +35 -32
- schubmult/schubmult_double/__init__.py +6 -12
- schubmult/schubmult_double/__main__.py +2 -1
- schubmult/schubmult_double/_funcs.py +245 -281
- schubmult/schubmult_double/_script.py +128 -70
- schubmult/schubmult_py/__init__.py +5 -3
- schubmult/schubmult_py/__main__.py +2 -1
- schubmult/schubmult_py/_funcs.py +68 -23
- schubmult/schubmult_py/_script.py +40 -58
- schubmult/schubmult_q/__init__.py +3 -7
- schubmult/schubmult_q/__main__.py +2 -1
- schubmult/schubmult_q/_funcs.py +41 -60
- schubmult/schubmult_q/_script.py +39 -30
- schubmult/schubmult_q_double/__init__.py +5 -11
- schubmult/schubmult_q_double/__main__.py +2 -1
- schubmult/schubmult_q_double/_funcs.py +99 -66
- schubmult/schubmult_q_double/_script.py +209 -150
- schubmult-2.0.4.dist-info/METADATA +542 -0
- schubmult-2.0.4.dist-info/RECORD +30 -0
- {schubmult-2.0.2.dist-info → schubmult-2.0.4.dist-info}/WHEEL +1 -1
- schubmult-2.0.4.dist-info/entry_points.txt +5 -0
- {schubmult-2.0.2.dist-info → schubmult-2.0.4.dist-info}/top_level.txt +0 -1
- schubmult/schubmult_double/_vars.py +0 -18
- schubmult/schubmult_py/_vars.py +0 -3
- schubmult/schubmult_q/_vars.py +0 -18
- schubmult/schubmult_q_double/_vars.py +0 -21
- schubmult-2.0.2.dist-info/METADATA +0 -455
- schubmult-2.0.2.dist-info/RECORD +0 -36
- schubmult-2.0.2.dist-info/entry_points.txt +0 -5
- tests/__init__.py +0 -0
- tests/test_fast_double_schubert.py +0 -145
- tests/test_fast_schubert.py +0 -38
- {schubmult-2.0.2.dist-info → schubmult-2.0.4.dist-info}/licenses/LICENSE +0 -0
schubmult/schubmult_q/_funcs.py
CHANGED
@@ -1,54 +1,39 @@
|
|
1
|
-
from
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
from functools import cached_property
|
2
|
+
|
3
|
+
from symengine import Add, Mul, Pow, symarray
|
4
|
+
|
5
5
|
from schubmult.perm_lib import (
|
6
|
-
elem_sym_perms_q,
|
7
6
|
add_perm_dict,
|
7
|
+
code,
|
8
8
|
compute_vpathdicts,
|
9
|
+
double_elem_sym_q,
|
10
|
+
elem_sym_perms_q,
|
11
|
+
inv,
|
9
12
|
inverse,
|
10
|
-
strict_theta,
|
11
13
|
medium_theta,
|
12
|
-
permtrim,
|
13
|
-
inv,
|
14
14
|
mulperm,
|
15
|
-
|
15
|
+
permtrim,
|
16
|
+
strict_theta,
|
16
17
|
uncode,
|
17
|
-
double_elem_sym_q,
|
18
|
-
q_var,
|
19
18
|
)
|
20
19
|
|
21
|
-
# from symengine import sympify, Add, Mul, Pow, symarray, Symbol, expand
|
22
|
-
# from schubmult._base_argparse import schub_argparse
|
23
|
-
# from schubmult.perm_lib import (
|
24
|
-
# trimcode,
|
25
|
-
# elem_sym_perms_q,
|
26
|
-
# add_perm_dict,
|
27
|
-
# compute_vpathdicts,
|
28
|
-
# inverse,
|
29
|
-
# strict_theta,
|
30
|
-
# medium_theta,
|
31
|
-
# permtrim,
|
32
|
-
# inv,
|
33
|
-
# mulperm,
|
34
|
-
# code,
|
35
|
-
# uncode,
|
36
|
-
# double_elem_sym_q,
|
37
|
-
# longest_element,
|
38
|
-
# check_blocks,
|
39
|
-
# is_parabolic,
|
40
|
-
# q_vector,
|
41
|
-
# omega,
|
42
|
-
# count_less_than,
|
43
|
-
# q_var,
|
44
|
-
# sg,
|
45
|
-
# n,
|
46
|
-
# )
|
47
|
-
# import numpy as np
|
48
|
-
# from schubmult.schubmult_q_double import factor_out_q_keep_factored
|
49
20
|
|
21
|
+
class _gvars:
|
22
|
+
@cached_property
|
23
|
+
def n(self):
|
24
|
+
return 100
|
25
|
+
|
26
|
+
@cached_property
|
27
|
+
def var_x(self):
|
28
|
+
return tuple(symarray("x", self.n).tolist())
|
29
|
+
|
30
|
+
@cached_property
|
31
|
+
def q_var(self):
|
32
|
+
return tuple(symarray("q", self.n).tolist())
|
50
33
|
|
51
|
-
|
34
|
+
_vars = _gvars()
|
35
|
+
|
36
|
+
def single_variable(coeff_dict, varnum, var_q=_vars.q_var):
|
52
37
|
ret = {}
|
53
38
|
for u in coeff_dict:
|
54
39
|
new_perms_k = elem_sym_perms_q(u, 1, varnum, var_q)
|
@@ -64,33 +49,32 @@ def single_variable(coeff_dict, varnum, var_q=q_var):
|
|
64
49
|
return ret
|
65
50
|
|
66
51
|
|
67
|
-
def mult_poly(coeff_dict, poly, var_x=var_x, var_q=q_var):
|
52
|
+
def mult_poly(coeff_dict, poly, var_x=_vars.var_x, var_q=_vars.q_var):
|
68
53
|
if poly in var_x:
|
69
54
|
return single_variable(coeff_dict, var_x.index(poly), var_q=var_q)
|
70
|
-
|
55
|
+
if isinstance(poly, Mul):
|
71
56
|
ret = coeff_dict
|
72
57
|
for a in poly.args:
|
73
58
|
ret = mult_poly(ret, a, var_x, var_q=var_q)
|
74
59
|
return ret
|
75
|
-
|
60
|
+
if isinstance(poly, Pow):
|
76
61
|
base = poly.args[0]
|
77
62
|
exponent = int(poly.args[1])
|
78
63
|
ret = coeff_dict
|
79
64
|
for i in range(int(exponent)):
|
80
65
|
ret = mult_poly(ret, base, var_x, var_q=var_q)
|
81
66
|
return ret
|
82
|
-
|
67
|
+
if isinstance(poly, Add):
|
83
68
|
ret = {}
|
84
69
|
for a in poly.args:
|
85
70
|
ret = add_perm_dict(ret, mult_poly(coeff_dict, a, var_x, var_q=var_q))
|
86
71
|
return ret
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
return ret
|
72
|
+
ret = {}
|
73
|
+
for perm in coeff_dict:
|
74
|
+
ret[perm] = poly * coeff_dict[perm]
|
75
|
+
return ret
|
92
76
|
|
93
|
-
def schubmult_db(perm_dict, v, q_var=q_var):
|
77
|
+
def schubmult_db(perm_dict, v, q_var=_vars.q_var):
|
94
78
|
if v == (1, 2):
|
95
79
|
return perm_dict
|
96
80
|
th = medium_theta(inverse(v))
|
@@ -118,14 +102,12 @@ def schubmult_db(perm_dict, v, q_var=q_var):
|
|
118
102
|
mx_th = 0
|
119
103
|
for vp in vpathdicts[index]:
|
120
104
|
for v2, vdiff, s in vpathdicts[index][vp]:
|
121
|
-
|
122
|
-
mx_th = th[index] - vdiff
|
105
|
+
mx_th = max(mx_th, th[index] - vdiff)
|
123
106
|
if index < len(th) - 1 and th[index] == th[index + 1]:
|
124
107
|
mx_th1 = 0
|
125
108
|
for vp in vpathdicts[index + 1]:
|
126
109
|
for v2, vdiff, s in vpathdicts[index + 1][vp]:
|
127
|
-
|
128
|
-
mx_th1 = th[index + 1] - vdiff
|
110
|
+
mx_th1 = max(mx_th1, th[index + 1] - vdiff)
|
129
111
|
newpathsums = {}
|
130
112
|
for up in vpathsums:
|
131
113
|
newpathsums0 = {}
|
@@ -142,7 +124,7 @@ def schubmult_db(perm_dict, v, q_var=q_var):
|
|
142
124
|
if udiff1 + vdiff2 == th[index]:
|
143
125
|
newpathsums0[(up1, udiff1, mul_val1)][v2] = (
|
144
126
|
newpathsums0[(up1, udiff1, mul_val1)].get(
|
145
|
-
v2, 0
|
127
|
+
v2, 0,
|
146
128
|
)
|
147
129
|
+ s2 * sumval * mul_val1
|
148
130
|
)
|
@@ -189,7 +171,7 @@ def schubmult_db(perm_dict, v, q_var=q_var):
|
|
189
171
|
vpathsums = newpathsums
|
190
172
|
toget = tuple(vmu)
|
191
173
|
ret_dict = add_perm_dict(
|
192
|
-
{ep: vpathsums[ep].get(toget, 0) for ep in vpathsums}, ret_dict
|
174
|
+
{ep: vpathsums[ep].get(toget, 0) for ep in vpathsums}, ret_dict,
|
193
175
|
)
|
194
176
|
return ret_dict
|
195
177
|
|
@@ -214,13 +196,12 @@ def schubmult(perm_dict, v):
|
|
214
196
|
mx_th = 0
|
215
197
|
for vp in vpathdicts[index]:
|
216
198
|
for v2, vdiff, s in vpathdicts[index][vp]:
|
217
|
-
|
218
|
-
mx_th = th[index] - vdiff
|
199
|
+
mx_th = max(mx_th, th[index] - vdiff)
|
219
200
|
newpathsums = {}
|
220
201
|
for up in vpathsums:
|
221
202
|
inv_up = inv(up)
|
222
203
|
newperms = elem_sym_perms_q(
|
223
|
-
up, min(mx_th, (inv_mu - (inv_up - inv_u)) - inv_vmu), th[index]
|
204
|
+
up, min(mx_th, (inv_mu - (inv_up - inv_u)) - inv_vmu), th[index],
|
224
205
|
)
|
225
206
|
for up2, udiff, mul_val in newperms:
|
226
207
|
if up2 not in newpathsums:
|
@@ -238,7 +219,7 @@ def schubmult(perm_dict, v):
|
|
238
219
|
vpathsums = newpathsums
|
239
220
|
toget = tuple(vmu)
|
240
221
|
ret_dict = add_perm_dict(
|
241
|
-
{ep: vpathsums[ep].get(toget, 0) for ep in vpathsums}, ret_dict
|
222
|
+
{ep: vpathsums[ep].get(toget, 0) for ep in vpathsums}, ret_dict,
|
242
223
|
)
|
243
224
|
return ret_dict
|
244
225
|
|
schubmult/schubmult_q/_script.py
CHANGED
@@ -1,30 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
mult_poly,
|
5
|
-
)
|
1
|
+
import sys
|
2
|
+
|
3
|
+
import numpy as np
|
6
4
|
from symengine import sympify
|
5
|
+
|
7
6
|
from schubmult._base_argparse import schub_argparse
|
8
7
|
from schubmult.perm_lib import (
|
9
|
-
trimcode,
|
10
|
-
permtrim,
|
11
|
-
inv,
|
12
|
-
mulperm,
|
13
|
-
uncode,
|
14
|
-
longest_element,
|
15
8
|
check_blocks,
|
9
|
+
count_less_than,
|
10
|
+
inv,
|
16
11
|
is_parabolic,
|
17
|
-
|
12
|
+
longest_element,
|
13
|
+
mulperm,
|
18
14
|
omega,
|
19
|
-
|
15
|
+
permtrim,
|
20
16
|
q_var,
|
17
|
+
q_vector,
|
21
18
|
sg,
|
19
|
+
trimcode,
|
20
|
+
uncode,
|
21
|
+
)
|
22
|
+
from schubmult.schubmult_q._funcs import (
|
23
|
+
schubmult,
|
24
|
+
schubmult_db,
|
22
25
|
)
|
23
|
-
import numpy as np
|
24
26
|
from schubmult.schubmult_q_double import factor_out_q_keep_factored
|
25
27
|
|
26
28
|
|
27
29
|
def _display_full(coeff_dict, args, formatter):
|
30
|
+
raw_result_dict = {}
|
28
31
|
ascode = args.ascode
|
29
32
|
parabolic_index = [int(s) for s in args.parabolic]
|
30
33
|
parabolic = len(parabolic_index) != 0
|
@@ -63,7 +66,7 @@ def _display_full(coeff_dict, args, formatter):
|
|
63
66
|
q_var[index + 1 - count_less_than(parabolic_index, index + 1)] ** qv[index]
|
64
67
|
for index in range(len(qv))
|
65
68
|
if index + 1 not in parabolic_index
|
66
|
-
]
|
69
|
+
],
|
67
70
|
)
|
68
71
|
|
69
72
|
try:
|
@@ -81,25 +84,28 @@ def _display_full(coeff_dict, args, formatter):
|
|
81
84
|
val = sympify(coeff_dict[perm]).expand()
|
82
85
|
if val != 0:
|
83
86
|
if ascode:
|
84
|
-
|
87
|
+
raw_result_dict[tuple(trimcode(perm))] = val
|
88
|
+
if formatter:
|
89
|
+
print(f"{trimcode(perm)!s} {formatter(val)}")
|
85
90
|
else:
|
86
|
-
|
91
|
+
raw_result_dict[perm] = val
|
92
|
+
if formatter:
|
93
|
+
print(f"{perm!s} {formatter(val)}")
|
94
|
+
return raw_result_dict
|
87
95
|
|
88
96
|
|
89
|
-
def main():
|
97
|
+
def main(argv=None):
|
98
|
+
if argv is None:
|
99
|
+
argv = sys.argv
|
90
100
|
try:
|
91
101
|
args, formatter = schub_argparse(
|
92
102
|
"schubmult_q",
|
93
103
|
"Compute products of quantum Schubert polynomials",
|
104
|
+
argv=argv[1:],
|
94
105
|
quantum=True,
|
95
106
|
)
|
96
107
|
|
97
|
-
mulstring = ""
|
98
108
|
|
99
|
-
mult = False
|
100
|
-
if args.mult is not None:
|
101
|
-
mult = True
|
102
|
-
mulstring = " ".join(args.mult)
|
103
109
|
|
104
110
|
perms = args.perms
|
105
111
|
|
@@ -130,7 +136,7 @@ def main():
|
|
130
136
|
index = parabolic_index[i] - 1
|
131
137
|
if sg(index, perms[0]) == 1 or sg(index, perms[1]) == 1:
|
132
138
|
print(
|
133
|
-
"Parabolic given but elements are not minimal length coset representatives."
|
139
|
+
"Parabolic given but elements are not minimal length coset representatives.",
|
134
140
|
)
|
135
141
|
exit(1)
|
136
142
|
|
@@ -143,15 +149,18 @@ def main():
|
|
143
149
|
for perm in perms[1:]:
|
144
150
|
coeff_dict = schubmult(coeff_dict, tuple(permtrim([*perm])))
|
145
151
|
|
146
|
-
if mult:
|
147
|
-
|
148
|
-
|
152
|
+
# if mult:
|
153
|
+
# mul_exp = sympify(mulstring)
|
154
|
+
# coeff_dict = mult_poly(coeff_dict, mul_exp)
|
149
155
|
|
150
|
-
if pr:
|
151
|
-
_display_full(coeff_dict, args, formatter)
|
156
|
+
if pr or formatter is None:
|
157
|
+
raw_result_dict = _display_full(coeff_dict, args, formatter)
|
158
|
+
if formatter is None:
|
159
|
+
return raw_result_dict
|
152
160
|
except BrokenPipeError:
|
153
161
|
pass
|
154
162
|
|
155
163
|
|
156
164
|
if __name__ == "__main__":
|
157
|
-
|
165
|
+
import sys
|
166
|
+
sys.exit(main(sys.argv))
|
@@ -1,16 +1,10 @@
|
|
1
|
-
from ._funcs import
|
2
|
-
schubmult,
|
3
|
-
schubmult_db,
|
4
|
-
mult_poly,
|
5
|
-
factor_out_q_keep_factored,
|
6
|
-
schubpoly_quantum
|
7
|
-
)
|
8
|
-
|
1
|
+
from ._funcs import factor_out_q_keep_factored, mult_poly, schubmult, schubmult_db, schubpoly_quantum
|
9
2
|
|
10
3
|
__all__ = [
|
4
|
+
"factor_out_q_keep_factored",
|
5
|
+
"mult_poly",
|
11
6
|
"schubmult",
|
12
7
|
"schubmult_db",
|
13
|
-
"
|
14
|
-
"factor_out_q_keep_factored",
|
15
|
-
"schubpoly_quantum"
|
8
|
+
"schubpoly_quantum",
|
16
9
|
]
|
10
|
+
|