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
@@ -1,37 +1,72 @@
|
|
1
|
-
from ._vars import (
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
)
|
8
|
-
from
|
1
|
+
# from ._vars import (
|
2
|
+
# var_y,
|
3
|
+
# var_x,
|
4
|
+
# var2,
|
5
|
+
# var3,
|
6
|
+
# q_var2,
|
7
|
+
# )
|
8
|
+
from functools import cached_property
|
9
|
+
|
10
|
+
from symengine import Add, Mul, Pow, expand, symarray
|
11
|
+
|
12
|
+
import schubmult.schubmult_double as norm_yz
|
9
13
|
from schubmult.perm_lib import (
|
10
|
-
elem_sym_perms_q,
|
11
14
|
add_perm_dict,
|
15
|
+
call_zvars,
|
12
16
|
compute_vpathdicts,
|
17
|
+
double_elem_sym_q,
|
18
|
+
elem_sym_func_q,
|
19
|
+
elem_sym_perms_q,
|
20
|
+
elem_sym_perms_q_op,
|
21
|
+
elem_sym_poly_q,
|
22
|
+
inv,
|
13
23
|
inverse,
|
14
|
-
strict_theta,
|
15
24
|
medium_theta,
|
16
|
-
permtrim,
|
17
|
-
inv,
|
18
25
|
mulperm,
|
26
|
+
permtrim,
|
27
|
+
strict_theta,
|
19
28
|
uncode,
|
20
|
-
double_elem_sym_q,
|
21
|
-
elem_sym_poly_q,
|
22
|
-
elem_sym_perms_q_op,
|
23
|
-
elem_sym_func_q,
|
24
|
-
call_zvars,
|
25
|
-
q_var,
|
26
29
|
)
|
27
|
-
import schubmult.schubmult_double as norm_yz
|
28
30
|
|
29
31
|
|
30
|
-
|
32
|
+
class _gvars:
|
33
|
+
@cached_property
|
34
|
+
def n(self):
|
35
|
+
return 100
|
36
|
+
|
37
|
+
# @cached_property
|
38
|
+
# def fvar(self):
|
39
|
+
# return 100
|
40
|
+
|
41
|
+
@cached_property
|
42
|
+
def var1(self):
|
43
|
+
return tuple(symarray("x", self.n).tolist())
|
44
|
+
|
45
|
+
@cached_property
|
46
|
+
def var2(self):
|
47
|
+
return tuple(symarray("y", self.n).tolist())
|
48
|
+
|
49
|
+
@cached_property
|
50
|
+
def var3(self):
|
51
|
+
return tuple(symarray("z", self.n).tolist())
|
52
|
+
|
53
|
+
@cached_property
|
54
|
+
def q_var(self):
|
55
|
+
return tuple(symarray("q", self.n).tolist())
|
56
|
+
|
57
|
+
@cached_property
|
58
|
+
def var_r(self):
|
59
|
+
return symarray("r", 100)
|
60
|
+
|
61
|
+
|
62
|
+
_vars = _gvars()
|
63
|
+
|
64
|
+
|
65
|
+
def E(p, k, varl=_vars.var2[1:], var_x=_vars.var1):
|
31
66
|
return elem_sym_poly_q(p, k, var_x[1:], varl)
|
32
67
|
|
33
68
|
|
34
|
-
def single_variable(coeff_dict, varnum, var2=var2, q_var=q_var):
|
69
|
+
def single_variable(coeff_dict, varnum, var2=_vars.var2, q_var=_vars.q_var):
|
35
70
|
ret = {}
|
36
71
|
for u in coeff_dict:
|
37
72
|
if varnum - 1 < len(u):
|
@@ -51,34 +86,33 @@ def single_variable(coeff_dict, varnum, var2=var2, q_var=q_var):
|
|
51
86
|
return ret
|
52
87
|
|
53
88
|
|
54
|
-
def mult_poly(coeff_dict, poly, var_x=
|
89
|
+
def mult_poly(coeff_dict, poly, var_x=_vars.var1, var_y=_vars.var2, q_var=_vars.q_var):
|
55
90
|
if poly in var_x:
|
56
91
|
return single_variable(coeff_dict, var_x.index(poly), var_y, q_var)
|
57
|
-
|
92
|
+
if isinstance(poly, Mul):
|
58
93
|
ret = coeff_dict
|
59
94
|
for a in poly.args:
|
60
95
|
ret = mult_poly(ret, a, var_x, var_y, q_var)
|
61
96
|
return ret
|
62
|
-
|
97
|
+
if isinstance(poly, Pow):
|
63
98
|
base = poly.args[0]
|
64
99
|
exponent = int(poly.args[1])
|
65
100
|
ret = coeff_dict
|
66
101
|
for i in range(int(exponent)):
|
67
102
|
ret = mult_poly(ret, base, var_x, var_y, q_var)
|
68
103
|
return ret
|
69
|
-
|
104
|
+
if isinstance(poly, Add):
|
70
105
|
ret = {}
|
71
106
|
for a in poly.args:
|
72
107
|
ret = add_perm_dict(ret, mult_poly(coeff_dict, a, var_x, var_y, q_var))
|
73
108
|
return ret
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
return ret
|
109
|
+
ret = {}
|
110
|
+
for perm in coeff_dict:
|
111
|
+
ret[perm] = poly * coeff_dict[perm]
|
112
|
+
return ret
|
79
113
|
|
80
114
|
|
81
|
-
def nil_hecke(perm_dict, v, n, var2=var2, var3=var3):
|
115
|
+
def nil_hecke(perm_dict, v, n, var2=_vars.var2, var3=_vars.var3):
|
82
116
|
if v == (1, 2):
|
83
117
|
return perm_dict
|
84
118
|
th = strict_theta(inverse(v))
|
@@ -96,8 +130,7 @@ def nil_hecke(perm_dict, v, n, var2=var2, var3=var3):
|
|
96
130
|
mx_th = 0
|
97
131
|
for vp in vpathdicts[index]:
|
98
132
|
for v2, vdiff, s in vpathdicts[index][vp]:
|
99
|
-
|
100
|
-
mx_th = th[index] - vdiff
|
133
|
+
mx_th = max(mx_th, th[index] - vdiff)
|
101
134
|
newpathsums = {}
|
102
135
|
for up in vpathsums:
|
103
136
|
newperms = elem_sym_perms_q_op(up, mx_th, th[index], n)
|
@@ -110,7 +143,8 @@ def nil_hecke(perm_dict, v, n, var2=var2, var3=var3):
|
|
110
143
|
continue
|
111
144
|
for v2, vdiff, s in vpathdicts[index][v]:
|
112
145
|
newpathsums[up2][v2] = newpathsums[up2].get(
|
113
|
-
v2,
|
146
|
+
v2,
|
147
|
+
0,
|
114
148
|
) + s * sumval * elem_sym_func_q(
|
115
149
|
th[index],
|
116
150
|
index + 1,
|
@@ -129,7 +163,7 @@ def nil_hecke(perm_dict, v, n, var2=var2, var3=var3):
|
|
129
163
|
return ret_dict
|
130
164
|
|
131
165
|
|
132
|
-
def elem_sym_func_q_q(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2, q_var=q_var):
|
166
|
+
def elem_sym_func_q_q(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2, q_var=_vars.q_var):
|
133
167
|
newk = k - udiff
|
134
168
|
if newk < vdiff:
|
135
169
|
return 0
|
@@ -151,7 +185,7 @@ def elem_sym_func_q_q(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2, q_var=q_
|
|
151
185
|
return elem_sym_poly_q(newk - vdiff, newk, yvars, zvars, q_var)
|
152
186
|
|
153
187
|
|
154
|
-
def schubpoly_quantum(v, var_x=
|
188
|
+
def schubpoly_quantum(v, var_x=_vars.var1, var_y=_vars.var2, q_var=_vars.q_var, coeff=1):
|
155
189
|
th = strict_theta(inverse(v))
|
156
190
|
mu = permtrim(uncode(th))
|
157
191
|
vmu = permtrim(mulperm([*v], mu))
|
@@ -169,13 +203,15 @@ def schubpoly_quantum(v, var_x=var_x, var_y=var2, q_var=q_var, coeff=1):
|
|
169
203
|
mx_th = 0
|
170
204
|
for vp in vpathdicts[index]:
|
171
205
|
for v2, vdiff, s in vpathdicts[index][vp]:
|
172
|
-
|
173
|
-
mx_th = th[index] - vdiff
|
206
|
+
mx_th = max(mx_th, th[index] - vdiff)
|
174
207
|
newpathsums = {}
|
175
208
|
for up in vpathsums:
|
176
209
|
inv_up = inv(up)
|
177
210
|
newperms = elem_sym_perms_q(
|
178
|
-
up,
|
211
|
+
up,
|
212
|
+
min(mx_th, (inv_mu - (inv_up - inv_u)) - inv_vmu),
|
213
|
+
th[index],
|
214
|
+
q_var,
|
179
215
|
)
|
180
216
|
for up2, udiff, mul_val in newperms:
|
181
217
|
if up2 not in newpathsums:
|
@@ -186,7 +222,8 @@ def schubpoly_quantum(v, var_x=var_x, var_y=var2, q_var=q_var, coeff=1):
|
|
186
222
|
continue
|
187
223
|
for v2, vdiff, s in vpathdicts[index][v]:
|
188
224
|
newpathsums[up2][v2] = newpathsums[up2].get(
|
189
|
-
v2,
|
225
|
+
v2,
|
226
|
+
0,
|
190
227
|
) + s * sumval * elem_sym_func_q_q(
|
191
228
|
th[index],
|
192
229
|
index + 1,
|
@@ -206,7 +243,7 @@ def schubpoly_quantum(v, var_x=var_x, var_y=var2, q_var=q_var, coeff=1):
|
|
206
243
|
return ret_dict[(1, 2)]
|
207
244
|
|
208
245
|
|
209
|
-
def schubmult(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
246
|
+
def schubmult(perm_dict, v, var2=_vars.var2, var3=_vars.var3, q_var=_vars.q_var):
|
210
247
|
if v == (1, 2):
|
211
248
|
return perm_dict
|
212
249
|
th = strict_theta(inverse(v))
|
@@ -228,8 +265,7 @@ def schubmult(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
|
228
265
|
mx_th = 0
|
229
266
|
for vp in vpathdicts[index]:
|
230
267
|
for v2, vdiff, s in vpathdicts[index][vp]:
|
231
|
-
|
232
|
-
mx_th = th[index] - vdiff
|
268
|
+
mx_th = max(mx_th, th[index] - vdiff)
|
233
269
|
newpathsums = {}
|
234
270
|
for up in vpathsums:
|
235
271
|
inv_up = inv(up)
|
@@ -248,7 +284,8 @@ def schubmult(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
|
248
284
|
continue
|
249
285
|
for v2, vdiff, s in vpathdicts[index][v]:
|
250
286
|
newpathsums[up2][v2] = newpathsums[up2].get(
|
251
|
-
v2,
|
287
|
+
v2,
|
288
|
+
0,
|
252
289
|
) + s * sumval * elem_sym_func_q(
|
253
290
|
th[index],
|
254
291
|
index + 1,
|
@@ -267,7 +304,7 @@ def schubmult(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
|
267
304
|
return ret_dict
|
268
305
|
|
269
306
|
|
270
|
-
def schubmult_db(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
307
|
+
def schubmult_db(perm_dict, v, var2=_vars.var2, var3=_vars.var3, q_var=_vars.q_var):
|
271
308
|
if v == (1, 2):
|
272
309
|
return perm_dict
|
273
310
|
th = medium_theta(inverse(v))
|
@@ -292,14 +329,12 @@ def schubmult_db(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
|
292
329
|
mx_th = 0
|
293
330
|
for vp in vpathdicts[index]:
|
294
331
|
for v2, vdiff, s in vpathdicts[index][vp]:
|
295
|
-
|
296
|
-
mx_th = th[index] - vdiff
|
332
|
+
mx_th = max(mx_th, th[index] - vdiff)
|
297
333
|
if index < len(th) - 1 and th[index] == th[index + 1]:
|
298
334
|
mx_th1 = 0
|
299
335
|
for vp in vpathdicts[index + 1]:
|
300
336
|
for v2, vdiff, s in vpathdicts[index + 1][vp]:
|
301
|
-
|
302
|
-
mx_th1 = th[index + 1] - vdiff
|
337
|
+
mx_th1 = max(mx_th1, th[index + 1] - vdiff)
|
303
338
|
newpathsums = {}
|
304
339
|
for up in vpathsums:
|
305
340
|
newpathsums0 = {}
|
@@ -331,9 +366,7 @@ def schubmult_db(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
|
331
366
|
if (up1, udiff1, mul_val1) not in newpathsums0:
|
332
367
|
newpathsums0[(up1, udiff1, mul_val1)] = {}
|
333
368
|
# newpathsums0[(up1, udiff1, mul_val1
|
334
|
-
newpathsums0[(up1, udiff1, mul_val1)][v2] = (
|
335
|
-
newpathsums0[(up1, udiff1, mul_val1)].get(v2, 0) + mulfac
|
336
|
-
)
|
369
|
+
newpathsums0[(up1, udiff1, mul_val1)][v2] = newpathsums0[(up1, udiff1, mul_val1)].get(v2, 0) + mulfac
|
337
370
|
|
338
371
|
for up1, udiff1, mul_val1 in newpathsums0:
|
339
372
|
for v in vpathdicts[index + 1]:
|
@@ -381,7 +414,8 @@ def schubmult_db(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
|
381
414
|
continue
|
382
415
|
for v2, vdiff, s in vpathdicts[index][v]:
|
383
416
|
newpathsums[up2][v2] = newpathsums[up2].get(
|
384
|
-
v2,
|
417
|
+
v2,
|
418
|
+
0,
|
385
419
|
) + s * sumval * elem_sym_func_q(
|
386
420
|
th[index],
|
387
421
|
index + 1,
|
@@ -400,7 +434,7 @@ def schubmult_db(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
|
|
400
434
|
return ret_dict
|
401
435
|
|
402
436
|
|
403
|
-
def div_diff(v, w, var2=var2, var3=var3):
|
437
|
+
def div_diff(v, w, var2=_vars.var2, var3=_vars.var3):
|
404
438
|
coeff_dict = {v: 1}
|
405
439
|
coeff_dict = norm_yz.schubmult_down(coeff_dict, w, var2, var3)
|
406
440
|
return coeff_dict.get((1, 2), 0)
|
@@ -427,28 +461,28 @@ def factor_out_q_keep_factored(poly):
|
|
427
461
|
if str(poly).find("q") == -1:
|
428
462
|
ret[1] = poly
|
429
463
|
return ret
|
430
|
-
|
464
|
+
if poly in _vars.q_var:
|
431
465
|
ret[poly] = 1
|
432
466
|
return ret
|
433
|
-
|
467
|
+
if isinstance(poly, Add):
|
434
468
|
ag = poly.args
|
435
469
|
ret = factor_out_q_keep_factored(ag[0])
|
436
470
|
for i in range(1, len(ag)):
|
437
471
|
ret = sum_q_dict(ret, factor_out_q_keep_factored(ag[i]))
|
438
472
|
return ret
|
439
|
-
|
473
|
+
if isinstance(poly, Mul):
|
440
474
|
ag = poly.args
|
441
475
|
ret = factor_out_q_keep_factored(ag[0])
|
442
476
|
for i in range(1, len(ag)):
|
443
477
|
ret = mul_q_dict(ret, factor_out_q_keep_factored(ag[i]))
|
444
478
|
return ret
|
445
|
-
|
479
|
+
if isinstance(poly, Pow):
|
446
480
|
base = poly.args[0]
|
447
481
|
exponent = int(poly.args[1])
|
448
482
|
|
449
483
|
ret = factor_out_q_keep_factored(base)
|
450
484
|
ret0 = dict(ret)
|
451
|
-
for
|
485
|
+
for _ in range(exponent - 1):
|
452
486
|
ret = mul_q_dict(ret, ret0)
|
453
487
|
|
454
488
|
# print(f"exponent {exponent}")
|
@@ -481,27 +515,26 @@ def factor_out_q(poly):
|
|
481
515
|
for var_maybe_pow in key.args:
|
482
516
|
if isinstance(var_maybe_pow, Pow):
|
483
517
|
real_var = var_maybe_pow.args[0]
|
484
|
-
if real_var in
|
518
|
+
if real_var in _vars.q_var:
|
485
519
|
q_part *= var_maybe_pow
|
486
520
|
else:
|
487
521
|
yz_part *= var_maybe_pow
|
488
522
|
else:
|
489
523
|
real_var = var_maybe_pow
|
490
|
-
if real_var in
|
524
|
+
if real_var in _vars.q_var:
|
491
525
|
q_part *= var_maybe_pow
|
492
526
|
else:
|
493
527
|
yz_part *= var_maybe_pow
|
494
528
|
elif isinstance(key, Pow):
|
495
529
|
real_var = key.args[0]
|
496
|
-
if real_var in
|
530
|
+
if real_var in _vars.q_var:
|
497
531
|
q_part *= key
|
498
532
|
else:
|
499
533
|
yz_part *= key
|
534
|
+
elif key in _vars.q_var:
|
535
|
+
q_part *= key
|
500
536
|
else:
|
501
|
-
|
502
|
-
q_part *= key
|
503
|
-
else:
|
504
|
-
yz_part *= key
|
537
|
+
yz_part *= key
|
505
538
|
|
506
539
|
ret[q_part] = ret.get(q_part, 0) + yz_part
|
507
540
|
return ret
|