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/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "2.0.
|
1
|
+
__version__ = "2.0.4"
|
schubmult/_base_argparse.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
from argparse import
|
1
|
+
from argparse import SUPPRESS, ArgumentParser, RawDescriptionHelpFormatter
|
2
2
|
|
3
3
|
|
4
|
-
def schub_argparse(prog_name, description, quantum=False, yz=False):
|
4
|
+
def schub_argparse(prog_name, description, argv, quantum=False, yz=False):
|
5
5
|
parser = ArgumentParser(
|
6
6
|
prog=prog_name,
|
7
7
|
description=description,
|
@@ -14,7 +14,6 @@ def schub_argparse(prog_name, description, quantum=False, yz=False):
|
|
14
14
|
""",
|
15
15
|
formatter_class=RawDescriptionHelpFormatter,
|
16
16
|
)
|
17
|
-
|
18
17
|
parser.add_argument(
|
19
18
|
"perms",
|
20
19
|
nargs="+",
|
@@ -75,7 +74,10 @@ def schub_argparse(prog_name, description, quantum=False, yz=False):
|
|
75
74
|
)
|
76
75
|
|
77
76
|
parser.add_argument(
|
78
|
-
"--down",
|
77
|
+
"--down",
|
78
|
+
action="store_true",
|
79
|
+
default=False,
|
80
|
+
help="Reverse multiplication",
|
79
81
|
)
|
80
82
|
|
81
83
|
parser.add_argument(
|
@@ -139,22 +141,36 @@ def schub_argparse(prog_name, description, quantum=False, yz=False):
|
|
139
141
|
help="Substitute commuting difference operators for perm1, then apply to Schub indexed by perm2",
|
140
142
|
)
|
141
143
|
|
144
|
+
disp_mode_list = ["basic", "pretty", "latex", "raw"]
|
145
|
+
|
146
|
+
if not yz and not quantum:
|
147
|
+
disp_mode_list = ["basic", "raw"]
|
148
|
+
|
142
149
|
parser.add_argument(
|
143
150
|
"--display-mode",
|
144
151
|
type=str,
|
145
152
|
required=False,
|
146
|
-
choices=
|
153
|
+
choices=disp_mode_list,
|
147
154
|
default="basic",
|
148
155
|
dest="disp_mode",
|
149
156
|
help="Method of displaying the output. Default basic",
|
150
157
|
)
|
151
158
|
|
152
|
-
|
159
|
+
parser.add_argument(
|
160
|
+
"-g",
|
161
|
+
action="store_true",
|
162
|
+
dest="gen",
|
163
|
+
help=SUPPRESS,
|
164
|
+
)
|
165
|
+
|
166
|
+
args = parser.parse_args(argv)
|
153
167
|
args.mulstring = ""
|
154
168
|
|
155
169
|
if args.mult is not None:
|
156
170
|
args.mulstring = " ".join(args.mult)
|
157
171
|
args.mult = True
|
172
|
+
else:
|
173
|
+
args.mult = False
|
158
174
|
|
159
175
|
for perm in args.perms:
|
160
176
|
try:
|
@@ -163,12 +179,30 @@ def schub_argparse(prog_name, description, quantum=False, yz=False):
|
|
163
179
|
except Exception as e:
|
164
180
|
print("Permutations must have integer values")
|
165
181
|
raise e
|
182
|
+
|
183
|
+
if args.gen:
|
184
|
+
import json
|
185
|
+
|
186
|
+
argv.pop(argv.index("-g"))
|
187
|
+
args.__dict__["cmd_line"] = [prog_name, *argv]
|
188
|
+
del args.__dict__["gen"]
|
189
|
+
cmd = " ".join(args.cmd_line)
|
190
|
+
cmd = cmd.replace("--", "").replace(" - ", "T").replace(" ", "_")
|
191
|
+
with open(f"{cmd}.json", "w") as js:
|
192
|
+
json.dump(args.__dict__, js, ensure_ascii=False, indent=1)
|
193
|
+
exit(0)
|
194
|
+
|
166
195
|
import sympy
|
167
196
|
|
168
|
-
formatter = lambda bob: str(bob) # noqa: E731
|
169
197
|
if args.disp_mode == "latex":
|
170
|
-
formatter =
|
198
|
+
formatter = ( # noqa: E731
|
199
|
+
lambda bob: sympy.latex(sympy.sympify(bob)).replace("\\left", "").replace("\\right", "")
|
200
|
+
)
|
171
201
|
elif args.disp_mode == "pretty":
|
172
202
|
formatter = lambda bob: sympy.pretty(sympy.sympify(bob)) # noqa: E731
|
203
|
+
elif args.disp_mode == "basic":
|
204
|
+
formatter = lambda bob: str(bob) # noqa: E731
|
205
|
+
elif args.disp_mode == "raw":
|
206
|
+
formatter = None
|
173
207
|
|
174
208
|
return args, formatter
|
schubmult/_tests.py
ADDED
@@ -0,0 +1,24 @@
|
|
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
|
schubmult/perm_lib.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
from
|
1
|
+
from bisect import bisect_left
|
2
2
|
from functools import cache
|
3
3
|
from itertools import chain
|
4
|
-
|
4
|
+
|
5
5
|
import numpy as np
|
6
|
+
from symengine import Mul, Pow, symarray, sympify
|
6
7
|
|
7
8
|
zero = sympify(0)
|
8
9
|
n = 100
|
@@ -18,7 +19,7 @@ def getpermval(perm, index):
|
|
18
19
|
|
19
20
|
def inv(perm):
|
20
21
|
L = len(perm)
|
21
|
-
v =
|
22
|
+
v = list(range(1, L + 1))
|
22
23
|
ans = 0
|
23
24
|
for i in range(L):
|
24
25
|
itr = bisect_left(v, perm[i])
|
@@ -30,7 +31,7 @@ def inv(perm):
|
|
30
31
|
def code(perm):
|
31
32
|
L = len(perm)
|
32
33
|
ret = []
|
33
|
-
v =
|
34
|
+
v = list(range(1, L + 1))
|
34
35
|
for i in range(L - 1):
|
35
36
|
itr = bisect_left(v, perm[i])
|
36
37
|
ret += [itr]
|
@@ -40,11 +41,8 @@ def code(perm):
|
|
40
41
|
|
41
42
|
def mulperm(perm1, perm2):
|
42
43
|
if len(perm1) < len(perm2):
|
43
|
-
return [
|
44
|
-
|
45
|
-
]
|
46
|
-
else:
|
47
|
-
return [perm1[perm2[i] - 1] for i in range(len(perm2))] + perm1[len(perm2) :]
|
44
|
+
return [perm1[perm2[i] - 1] if perm2[i] <= len(perm1) else perm2[i] for i in range(len(perm2))]
|
45
|
+
return [perm1[perm2[i] - 1] for i in range(len(perm2))] + perm1[len(perm2) :]
|
48
46
|
|
49
47
|
|
50
48
|
def uncode(cd):
|
@@ -64,7 +62,7 @@ def uncode(cd):
|
|
64
62
|
def reversecode(perm):
|
65
63
|
ret = []
|
66
64
|
for i in range(len(perm) - 1, 0, -1):
|
67
|
-
ret = [0
|
65
|
+
ret = [0, *ret]
|
68
66
|
for j in range(i, -1, -1):
|
69
67
|
if perm[i] > perm[j]:
|
70
68
|
ret[-1] += 1
|
@@ -80,7 +78,7 @@ def reverseuncode(cd):
|
|
80
78
|
fullperm = [i + 1 for i in range(len(cd2) + 1)]
|
81
79
|
perm = []
|
82
80
|
for i in range(len(cd2) - 1, 0, -1):
|
83
|
-
perm = [fullperm[cd2[i]]
|
81
|
+
perm = [fullperm[cd2[i]], *perm]
|
84
82
|
fullperm.pop(cd2[i])
|
85
83
|
perm += [fullperm[0]]
|
86
84
|
return perm
|
@@ -205,12 +203,7 @@ def elem_sym_perms_q(orig_perm, p, k, q_var=q_var):
|
|
205
203
|
up_perm2 = [*up_perm, len(up_perm) + 1]
|
206
204
|
if len(up_perm2) < k + 1:
|
207
205
|
up_perm2 += [i + 1 for i in range(len(up_perm2), k + 2)]
|
208
|
-
pos_list = [
|
209
|
-
i
|
210
|
-
for i in range(k)
|
211
|
-
if (i >= len(orig_perm) and up_perm2[i] == i + 1)
|
212
|
-
or (i < len(orig_perm) and up_perm2[i] == orig_perm[i])
|
213
|
-
]
|
206
|
+
pos_list = [i for i in range(k) if (i >= len(orig_perm) and up_perm2[i] == i + 1) or (i < len(orig_perm) and up_perm2[i] == orig_perm[i])]
|
214
207
|
for j in range(min(len(up_perm2) - 1, last_j), k - 1, -1):
|
215
208
|
for i in pos_list:
|
216
209
|
ct = count_bruhat(up_perm2, i, j)
|
@@ -237,12 +230,7 @@ def elem_sym_perms_q_op(orig_perm, p, k, n, q_var=q_var):
|
|
237
230
|
up_perm2 = [*up_perm]
|
238
231
|
if len(up_perm) < n:
|
239
232
|
up_perm2 += [i + 1 for i in range(len(up_perm2), n)]
|
240
|
-
pos_list = [
|
241
|
-
i
|
242
|
-
for i in range(k)
|
243
|
-
if (i >= len(orig_perm) and up_perm2[i] == i + 1)
|
244
|
-
or (i < len(orig_perm) and up_perm2[i] == orig_perm[i])
|
245
|
-
]
|
233
|
+
pos_list = [i for i in range(k) if (i >= len(orig_perm) and up_perm2[i] == i + 1) or (i < len(orig_perm) and up_perm2[i] == orig_perm[i])]
|
246
234
|
for j in range(last_j, n):
|
247
235
|
for i in pos_list:
|
248
236
|
ct = count_bruhat(up_perm2, i, j)
|
@@ -268,14 +256,12 @@ def q_vector(q_exp, q_var=q_var):
|
|
268
256
|
return ret
|
269
257
|
if q_exp in q_var:
|
270
258
|
i = qvar_list.index(q_exp)
|
271
|
-
|
272
|
-
return ret
|
259
|
+
return [0 for j in range(i - 1)] + [1]
|
273
260
|
if isinstance(q_exp, Pow):
|
274
261
|
qv = q_exp.args[0]
|
275
262
|
expon = int(q_exp.args[1])
|
276
263
|
i = qvar_list.index(qv)
|
277
|
-
|
278
|
-
return ret
|
264
|
+
return [0 for j in range(i - 1)] + [expon]
|
279
265
|
if isinstance(q_exp, Mul):
|
280
266
|
for a in q_exp.args:
|
281
267
|
v1 = q_vector(a)
|
@@ -319,16 +305,7 @@ def reduce_q_coeff(u, v, w, qv):
|
|
319
305
|
if sg(i, w) == 0:
|
320
306
|
qv_ret[i] -= 1
|
321
307
|
return u, tuple(permtrim(ret_v)), tuple(permtrim(ret_w)), qv_ret, True
|
322
|
-
|
323
|
-
ret_u = [*u]
|
324
|
-
ret_u[i], ret_u[i + 1] = ret_u[i + 1], ret_u[i]
|
325
|
-
ret_w = [*w] + [j + 1 for j in range(len(w), i + 2)]
|
326
|
-
ret_w[i], ret_w[i + 1] = ret_w[i + 1], ret_w[i]
|
327
|
-
qv_ret = [*qv]
|
328
|
-
if sg(i, w) == 0:
|
329
|
-
qv_ret[i] -= 1
|
330
|
-
return tuple(permtrim(ret_u)), v, tuple(permtrim(ret_w)), qv_ret, True
|
331
|
-
elif sg(i, u) == 1 and sg(i, v) == 1 and sg(i, w) + omega(i + 1, qv) == 2:
|
308
|
+
if (sg(i, u) == 1 and sg(i, v) == 0 and sg(i, w) + omega(i + 1, qv) == 1) or (sg(i, u) == 1 and sg(i, v) == 1 and sg(i, w) + omega(i + 1, qv) == 2):
|
332
309
|
ret_u = [*u]
|
333
310
|
ret_u[i], ret_u[i + 1] = ret_u[i + 1], ret_u[i]
|
334
311
|
ret_w = [*w] + [j + 1 for j in range(len(w), i + 2)]
|
@@ -342,16 +319,7 @@ def reduce_q_coeff(u, v, w, qv):
|
|
342
319
|
|
343
320
|
def reduce_q_coeff_u_only(u, v, w, qv):
|
344
321
|
for i in range(len(qv)):
|
345
|
-
if sg(i, u) == 1 and sg(i, v) == 0 and sg(i, w) + omega(i + 1, qv) == 1:
|
346
|
-
ret_u = [*u]
|
347
|
-
ret_u[i], ret_u[i + 1] = ret_u[i + 1], ret_u[i]
|
348
|
-
ret_w = [*w] + [j + 1 for j in range(len(w), i + 2)]
|
349
|
-
ret_w[i], ret_w[i + 1] = ret_w[i + 1], ret_w[i]
|
350
|
-
qv_ret = [*qv]
|
351
|
-
if sg(i, w) == 0:
|
352
|
-
qv_ret[i] -= 1
|
353
|
-
return tuple(permtrim(ret_u)), v, tuple(permtrim(ret_w)), qv_ret, True
|
354
|
-
elif sg(i, u) == 1 and sg(i, v) == 1 and sg(i, w) + omega(i + 1, qv) == 2:
|
322
|
+
if (sg(i, u) == 1 and sg(i, v) == 0 and sg(i, w) + omega(i + 1, qv) == 1) or (sg(i, u) == 1 and sg(i, v) == 1 and sg(i, w) + omega(i + 1, qv) == 2):
|
355
323
|
ret_u = [*u]
|
356
324
|
ret_u[i], ret_u[i + 1] = ret_u[i + 1], ret_u[i]
|
357
325
|
ret_w = [*w] + [j + 1 for j in range(len(w), i + 2)]
|
@@ -372,7 +340,7 @@ def longest_element(indices):
|
|
372
340
|
j = indices[i] - 1
|
373
341
|
if sg(j, perm) == 0:
|
374
342
|
if len(perm) < j + 2:
|
375
|
-
perm = perm +
|
343
|
+
perm = perm + list(range(len(perm) + 1, j + 3))
|
376
344
|
perm[j], perm[j + 1] = perm[j + 1], perm[j]
|
377
345
|
did_one = True
|
378
346
|
return permtrim(perm)
|
@@ -433,7 +401,7 @@ def kdown_perms(perm, monoperm, p, k):
|
|
433
401
|
down_perm_list2 = []
|
434
402
|
for perm2, s in down_perm_list:
|
435
403
|
L = len(perm2)
|
436
|
-
if
|
404
|
+
if k > L:
|
437
405
|
continue
|
438
406
|
s2 = -s
|
439
407
|
for b in chain(range(k - 1), range(k, L)):
|
@@ -523,7 +491,6 @@ def elem_sym_poly_q(p, k, varl1, varl2, q_var=q_var):
|
|
523
491
|
|
524
492
|
|
525
493
|
def elem_sym_poly(p, k, varl1, varl2, xstart=0, ystart=0):
|
526
|
-
global zero, one
|
527
494
|
if p > k:
|
528
495
|
return zero
|
529
496
|
if p == 0:
|
@@ -543,28 +510,32 @@ def elem_sym_poly(p, k, varl1, varl2, xstart=0, ystart=0):
|
|
543
510
|
ysm = ystart + mid
|
544
511
|
kmm = k - mid
|
545
512
|
res = elem_sym_poly(p, mid, varl1, varl2, xstart, ystart) + elem_sym_poly(
|
546
|
-
p,
|
513
|
+
p,
|
514
|
+
kmm,
|
515
|
+
varl1,
|
516
|
+
varl2,
|
517
|
+
xsm,
|
518
|
+
ysm,
|
547
519
|
)
|
548
520
|
for p2 in range(max(1, p - kmm), min(p, mid + 1)):
|
549
521
|
res += elem_sym_poly(p2, mid, varl1, varl2, xstart, ystart) * elem_sym_poly(
|
550
|
-
p - p2,
|
522
|
+
p - p2,
|
523
|
+
kmm,
|
524
|
+
varl1,
|
525
|
+
varl2,
|
526
|
+
xsm,
|
527
|
+
ysm - p2,
|
551
528
|
)
|
552
529
|
return res
|
553
530
|
|
554
531
|
|
555
532
|
@cache
|
556
|
-
def call_zvars(v1, v2, k, i):
|
557
|
-
v3 = [*v2
|
558
|
-
|
559
|
-
[v3[i - 1]]
|
560
|
-
+ [v3[j] for j in range(len(v1), len(v3)) if v3[j] != j + 1 and j != i - 1]
|
561
|
-
+ [v3[j] for j in range(len(v1)) if v1[j] != v3[j] and j != i - 1]
|
562
|
-
)
|
563
|
-
return zvars
|
533
|
+
def call_zvars(v1, v2, k, i): # noqa: ARG001
|
534
|
+
v3 = [*v2, *list(range(len(v2) + 1, i + 1))]
|
535
|
+
return [v3[i - 1]] + [v3[j] for j in range(len(v1), len(v3)) if v3[j] != j + 1 and j != i - 1] + [v3[j] for j in range(len(v1)) if v1[j] != v3[j] and j != i - 1]
|
564
536
|
|
565
537
|
|
566
538
|
def elem_sym_func(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2):
|
567
|
-
global zero, one
|
568
539
|
newk = k - udiff
|
569
540
|
if newk < vdiff:
|
570
541
|
return zero
|
@@ -584,7 +555,6 @@ def elem_sym_func(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2):
|
|
584
555
|
|
585
556
|
|
586
557
|
def elem_sym_func_q(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2):
|
587
|
-
global zero, one
|
588
558
|
newk = k - udiff
|
589
559
|
if newk < vdiff:
|
590
560
|
return zero
|
@@ -629,14 +599,13 @@ def p_trans(part):
|
|
629
599
|
|
630
600
|
|
631
601
|
def cycle(p, q):
|
632
|
-
return
|
602
|
+
return list(range(1, p)) + [i + 1 for i in range(p, p + q)] + [p]
|
633
603
|
|
634
604
|
|
635
605
|
def phi1(u):
|
636
606
|
c_star = code(inverse(u))
|
637
607
|
c_star.pop(0)
|
638
|
-
|
639
|
-
return phi_u
|
608
|
+
return inverse(uncode(c_star))
|
640
609
|
|
641
610
|
|
642
611
|
def one_dominates(u, w):
|
@@ -745,30 +714,14 @@ def reduce_descents(u, v, w):
|
|
745
714
|
found_one = True
|
746
715
|
while found_one:
|
747
716
|
found_one = False
|
748
|
-
if (
|
749
|
-
will_formula_work(u2, v2)
|
750
|
-
or will_formula_work(v2, u2)
|
751
|
-
or one_dominates(u2, w2)
|
752
|
-
or is_reducible(v2)
|
753
|
-
or inv(w2) - inv(u2) == 1
|
754
|
-
):
|
717
|
+
if will_formula_work(u2, v2) or will_formula_work(v2, u2) or one_dominates(u2, w2) or is_reducible(v2) or inv(w2) - inv(u2) == 1:
|
755
718
|
break
|
756
719
|
for i in range(len(w2) - 2, -1, -1):
|
757
|
-
if (
|
758
|
-
w2[i] > w2[i + 1]
|
759
|
-
and i < len(v2) - 1
|
760
|
-
and v2[i] > v2[i + 1]
|
761
|
-
and (i >= len(u2) - 1 or u2[i] < u2[i + 1])
|
762
|
-
):
|
720
|
+
if w2[i] > w2[i + 1] and i < len(v2) - 1 and v2[i] > v2[i + 1] and (i >= len(u2) - 1 or u2[i] < u2[i + 1]):
|
763
721
|
w2[i], w2[i + 1] = w2[i + 1], w2[i]
|
764
722
|
v2[i], v2[i + 1] = v2[i + 1], v2[i]
|
765
723
|
found_one = True
|
766
|
-
elif (
|
767
|
-
w2[i] > w2[i + 1]
|
768
|
-
and i < len(u2) - 1
|
769
|
-
and u2[i] > u2[i + 1]
|
770
|
-
and (i >= len(v2) - 1 or v2[i] < v2[i + 1])
|
771
|
-
):
|
724
|
+
elif w2[i] > w2[i + 1] and i < len(u2) - 1 and u2[i] > u2[i + 1] and (i >= len(v2) - 1 or v2[i] < v2[i + 1]):
|
772
725
|
w2[i], w2[i + 1] = w2[i + 1], w2[i]
|
773
726
|
u2[i], u2[i + 1] = u2[i + 1], u2[i]
|
774
727
|
found_one = True
|
@@ -802,18 +755,16 @@ def try_reduce_v(u, v, w):
|
|
802
755
|
if i >= len(u2) - 1 or u2[i] < u2[i + 1]:
|
803
756
|
v2[i], v2[i + 1] = v2[i + 1], v2[i]
|
804
757
|
if i >= len(w2) - 1:
|
805
|
-
w2 +=
|
758
|
+
w2 += list(range(len(w2) + 1, i + 3))
|
806
759
|
w2[i + 1], w2[i] = w2[i], w2[i + 1]
|
807
760
|
if is_reducible(v2):
|
808
761
|
return tuple(permtrim(u2)), tuple(permtrim(v2)), tuple(permtrim(w2))
|
809
|
-
|
810
|
-
|
811
|
-
elif i < len(w2) - 1 and w2[i] > w2[i + 1]:
|
762
|
+
return try_reduce_v(u2, v2, w2)
|
763
|
+
if i < len(w2) - 1 and w2[i] > w2[i + 1]:
|
812
764
|
u2[i], u2[i + 1] = u2[i + 1], u2[i]
|
813
765
|
v2[i], v2[i + 1] = v2[i + 1], v2[i]
|
814
766
|
return try_reduce_v(u2, v2, w2)
|
815
|
-
|
816
|
-
return tuple(permtrim(u2)), tuple(permtrim(v2)), tuple(permtrim(w2))
|
767
|
+
return tuple(permtrim(u2)), tuple(permtrim(v2)), tuple(permtrim(w2))
|
817
768
|
return tuple(permtrim(u2)), tuple(permtrim(v2)), tuple(permtrim(w2))
|
818
769
|
|
819
770
|
|
@@ -829,18 +780,16 @@ def try_reduce_u(u, v, w):
|
|
829
780
|
if i >= len(v2) - 1 or v2[i] < v2[i + 1]:
|
830
781
|
u2[i], u2[i + 1] = u2[i + 1], u2[i]
|
831
782
|
if i > len(w2) - 1:
|
832
|
-
w2 +=
|
783
|
+
w2 += list(range(len(w2) + 1, i + 3))
|
833
784
|
w2[i + 1], w2[i] = w2[i], w2[i + 1]
|
834
785
|
if one_dominates(u, w):
|
835
786
|
return tuple(permtrim(u2)), tuple(permtrim(v2)), tuple(permtrim(w2))
|
836
|
-
|
837
|
-
|
838
|
-
elif i < len(w2) - 1 and w2[i] > w2[i + 1]:
|
787
|
+
return try_reduce_u(u2, v2, w2)
|
788
|
+
if i < len(w2) - 1 and w2[i] > w2[i + 1]:
|
839
789
|
u2[i], u2[i + 1] = u2[i + 1], u2[i]
|
840
790
|
v2[i], v2[i + 1] = v2[i + 1], v2[i]
|
841
791
|
return try_reduce_u(u2, v2, w2)
|
842
|
-
|
843
|
-
return tuple(permtrim(u2)), tuple(permtrim(v2)), tuple(permtrim(w2))
|
792
|
+
return tuple(permtrim(u2)), tuple(permtrim(v2)), tuple(permtrim(w2))
|
844
793
|
return tuple(permtrim(u2)), tuple(permtrim(v2)), tuple(permtrim(w2))
|
845
794
|
|
846
795
|
|
@@ -863,15 +812,14 @@ def will_formula_work(u, v):
|
|
863
812
|
found_one = True
|
864
813
|
if i < len(u) - 1 and u[i] > u[i + 1]:
|
865
814
|
return False
|
866
|
-
|
867
|
-
|
868
|
-
break
|
815
|
+
vn1muv[i], vn1muv[i + 1] = vn1muv[i + 1], vn1muv[i]
|
816
|
+
break
|
869
817
|
if not found_one:
|
870
818
|
return True
|
871
819
|
|
872
820
|
|
873
821
|
def pull_out_var(vnum, v):
|
874
|
-
vup = v
|
822
|
+
vup = [*v, len(v) + 1]
|
875
823
|
if vnum >= len(v):
|
876
824
|
return [[[], v]]
|
877
825
|
vpm_list = [(vup, 0)]
|
@@ -885,13 +833,9 @@ def pull_out_var(vnum, v):
|
|
885
833
|
vp = permtrim(vpm2)
|
886
834
|
ret_list += [
|
887
835
|
[
|
888
|
-
[
|
889
|
-
v[i]
|
890
|
-
for i in range(vnum, len(v))
|
891
|
-
if ((i > len(vp) and v[i] == i) or (i <= len(vp) and v[i] == vp[i - 1]))
|
892
|
-
],
|
836
|
+
[v[i] for i in range(vnum, len(v)) if ((i > len(vp) and v[i] == i) or (i <= len(vp) and v[i] == vp[i - 1]))],
|
893
837
|
vp,
|
894
|
-
]
|
838
|
+
],
|
895
839
|
]
|
896
840
|
for j in range(vnum, len(vup)):
|
897
841
|
if vpm[j] <= b:
|
@@ -909,13 +853,9 @@ def pull_out_var(vnum, v):
|
|
909
853
|
vp = permtrim(vpm2)
|
910
854
|
ret_list += [
|
911
855
|
[
|
912
|
-
[
|
913
|
-
v[i]
|
914
|
-
for i in range(vnum, len(v))
|
915
|
-
if ((i > len(vp) and v[i] == i) or (i <= len(vp) and v[i] == vp[i - 1]))
|
916
|
-
],
|
856
|
+
[v[i] for i in range(vnum, len(v)) if ((i > len(vp) and v[i] == i) or (i <= len(vp) and v[i] == vp[i - 1]))],
|
917
857
|
vp,
|
918
|
-
]
|
858
|
+
],
|
919
859
|
]
|
920
860
|
return ret_list
|
921
861
|
|
@@ -1,25 +1,25 @@
|
|
1
1
|
from sage.all import * # noqa: F403
|
2
2
|
|
3
|
-
from ._fast_schubert_polynomial_ring import (
|
4
|
-
FastSchubertPolynomialRing,
|
5
|
-
FastSchubertPolynomial,
|
6
|
-
FastSchubertPolynomialRing_base,
|
7
|
-
FastQuantumSchubertPolynomialRing,
|
8
|
-
)
|
9
3
|
from ._fast_double_schubert_polynomial_ring import (
|
10
|
-
FastDoubleSchubertPolynomialRing,
|
11
4
|
FastDoubleSchubertPolynomial,
|
5
|
+
FastDoubleSchubertPolynomialRing,
|
12
6
|
FastDoubleSchubertPolynomialRing_base,
|
13
|
-
FastQuantumDoubleSchubertPolynomialRing,
|
7
|
+
FastQuantumDoubleSchubertPolynomialRing,
|
8
|
+
)
|
9
|
+
from ._fast_schubert_polynomial_ring import (
|
10
|
+
FastQuantumSchubertPolynomialRing,
|
11
|
+
FastSchubertPolynomial,
|
12
|
+
FastSchubertPolynomialRing,
|
13
|
+
FastSchubertPolynomialRing_base,
|
14
14
|
)
|
15
15
|
|
16
16
|
__all__ = [
|
17
|
-
"FastSchubertPolynomialRing",
|
18
|
-
"FastSchubertPolynomial",
|
19
|
-
"FastSchubertPolynomialRing_base",
|
20
|
-
"FastDoubleSchubertPolynomialRing",
|
21
17
|
"FastDoubleSchubertPolynomial",
|
18
|
+
"FastDoubleSchubertPolynomialRing",
|
22
19
|
"FastDoubleSchubertPolynomialRing_base",
|
20
|
+
"FastQuantumDoubleSchubertPolynomialRing",
|
23
21
|
"FastQuantumSchubertPolynomialRing",
|
24
|
-
"
|
22
|
+
"FastSchubertPolynomial",
|
23
|
+
"FastSchubertPolynomialRing",
|
24
|
+
"FastSchubertPolynomialRing_base",
|
25
25
|
]
|