schubmult 2.0.3__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.
Files changed (32) hide show
  1. schubmult/__init__.py +1 -1
  2. schubmult/_base_argparse.py +11 -6
  3. schubmult/_tests.py +19 -4
  4. schubmult/perm_lib.py +52 -112
  5. schubmult/sage_integration/__init__.py +13 -14
  6. schubmult/sage_integration/_fast_double_schubert_polynomial_ring.py +92 -128
  7. schubmult/sage_integration/_fast_schubert_polynomial_ring.py +55 -54
  8. schubmult/sage_integration/_indexing.py +35 -39
  9. schubmult/schubmult_double/__init__.py +5 -15
  10. schubmult/schubmult_double/__main__.py +1 -0
  11. schubmult/schubmult_double/_funcs.py +140 -256
  12. schubmult/schubmult_double/_script.py +41 -41
  13. schubmult/schubmult_py/__init__.py +3 -4
  14. schubmult/schubmult_py/__main__.py +1 -0
  15. schubmult/schubmult_py/_funcs.py +18 -18
  16. schubmult/schubmult_py/_script.py +12 -11
  17. schubmult/schubmult_q/__init__.py +2 -7
  18. schubmult/schubmult_q/__main__.py +1 -0
  19. schubmult/schubmult_q/_funcs.py +24 -27
  20. schubmult/schubmult_q/_script.py +27 -21
  21. schubmult/schubmult_q_double/__init__.py +4 -11
  22. schubmult/schubmult_q_double/__main__.py +1 -0
  23. schubmult/schubmult_q_double/_funcs.py +48 -48
  24. schubmult/schubmult_q_double/_script.py +39 -41
  25. schubmult-2.0.4.dist-info/METADATA +542 -0
  26. schubmult-2.0.4.dist-info/RECORD +30 -0
  27. {schubmult-2.0.3.dist-info → schubmult-2.0.4.dist-info}/WHEEL +1 -1
  28. schubmult-2.0.3.dist-info/METADATA +0 -455
  29. schubmult-2.0.3.dist-info/RECORD +0 -30
  30. {schubmult-2.0.3.dist-info → schubmult-2.0.4.dist-info}/entry_points.txt +0 -0
  31. {schubmult-2.0.3.dist-info → schubmult-2.0.4.dist-info}/licenses/LICENSE +0 -0
  32. {schubmult-2.0.3.dist-info → schubmult-2.0.4.dist-info}/top_level.txt +0 -0
schubmult/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2.0.3"
1
+ __version__ = "2.0.4"
@@ -1,4 +1,4 @@
1
- from argparse import ArgumentParser, SUPPRESS, RawDescriptionHelpFormatter
1
+ from argparse import SUPPRESS, ArgumentParser, RawDescriptionHelpFormatter
2
2
 
3
3
 
4
4
  def schub_argparse(prog_name, description, argv, quantum=False, yz=False):
@@ -74,7 +74,10 @@ def schub_argparse(prog_name, description, argv, quantum=False, yz=False):
74
74
  )
75
75
 
76
76
  parser.add_argument(
77
- "--down", action="store_true", default=False, help="Reverse multiplication"
77
+ "--down",
78
+ action="store_true",
79
+ default=False,
80
+ help="Reverse multiplication",
78
81
  )
79
82
 
80
83
  parser.add_argument(
@@ -179,12 +182,14 @@ def schub_argparse(prog_name, description, argv, quantum=False, yz=False):
179
182
 
180
183
  if args.gen:
181
184
  import json
182
- import sys
183
185
 
184
186
  argv.pop(argv.index("-g"))
185
- args.__dict__["cmd_line"] = ["script"] + argv
187
+ args.__dict__["cmd_line"] = [prog_name, *argv]
186
188
  del args.__dict__["gen"]
187
- json.dump(args.__dict__, sys.stdout, ensure_ascii=False, indent=4)
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)
188
193
  exit(0)
189
194
 
190
195
  import sympy
@@ -192,7 +197,7 @@ def schub_argparse(prog_name, description, argv, quantum=False, yz=False):
192
197
  if args.disp_mode == "latex":
193
198
  formatter = ( # noqa: E731
194
199
  lambda bob: sympy.latex(sympy.sympify(bob)).replace("\\left", "").replace("\\right", "")
195
- ) # noqa: E731
200
+ )
196
201
  elif args.disp_mode == "pretty":
197
202
  formatter = lambda bob: sympy.pretty(sympy.sympify(bob)) # noqa: E731
198
203
  elif args.disp_mode == "basic":
schubmult/_tests.py CHANGED
@@ -1,9 +1,24 @@
1
+
1
2
  def get_json(file: str):
2
- import os
3
3
  import json
4
+ import os
4
5
 
5
6
  script_dir = os.path.dirname(__file__)
6
- rel_path = f"../tests/{file}.json"
7
+ rel_path = f"../tests/script_tests/data/{file}.json"
7
8
  abs_file_path = os.path.join(script_dir, rel_path)
8
- with open(abs_file_path, "r") as f:
9
- return json.load(f)
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 symengine import sympify, Mul, Pow, symarray
1
+ from bisect import bisect_left
2
2
  from functools import cache
3
3
  from itertools import chain
4
- from bisect import bisect_left
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 = [i for i in range(1, L + 1)]
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 = [i for i in range(1, L + 1)]
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
- perm1[perm2[i] - 1] if perm2[i] <= len(perm1) else perm2[i] for i in range(len(perm2))
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] + ret
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]]] + perm
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
- ret = [0 for j in range(i - 1)] + [1]
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
- ret = [0 for j in range(i - 1)] + [expon]
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
- elif sg(i, u) == 1 and sg(i, v) == 0 and sg(i, w) + omega(i + 1, qv) == 1:
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 + [index for index in range(len(perm) + 1, j + 3)]
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 L < k:
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, kmm, varl1, varl2, xsm, ysm
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, kmm, varl1, varl2, xsm, ysm - 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] + [j for j in range(len(v2) + 1, i + 1)]
558
- zvars = (
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 [i for i in range(1, p)] + [i + 1 for i in range(p, p + q)] + [p]
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
- phi_u = inverse(uncode(c_star))
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 += [j for j in range(len(w2) + 1, i + 3)]
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
- else:
810
- return try_reduce_v(u2, v2, w2)
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
- else:
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 += [j for j in range(len(w2) + 1, i + 3)]
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
- else:
837
- return try_reduce_u(u2, v2, w2)
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
- else:
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
- else:
867
- vn1muv[i], vn1muv[i + 1] = vn1muv[i + 1], vn1muv[i]
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 + [len(v) + 1]
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,26 +1,25 @@
1
1
  from sage.all import * # noqa: F403
2
2
 
3
-
4
- from ._fast_schubert_polynomial_ring import (
5
- FastSchubertPolynomialRing,
6
- FastSchubertPolynomial,
7
- FastSchubertPolynomialRing_base,
8
- FastQuantumSchubertPolynomialRing,
9
- )
10
3
  from ._fast_double_schubert_polynomial_ring import (
11
- FastDoubleSchubertPolynomialRing,
12
4
  FastDoubleSchubertPolynomial,
5
+ FastDoubleSchubertPolynomialRing,
13
6
  FastDoubleSchubertPolynomialRing_base,
14
- FastQuantumDoubleSchubertPolynomialRing,
7
+ FastQuantumDoubleSchubertPolynomialRing,
8
+ )
9
+ from ._fast_schubert_polynomial_ring import (
10
+ FastQuantumSchubertPolynomialRing,
11
+ FastSchubertPolynomial,
12
+ FastSchubertPolynomialRing,
13
+ FastSchubertPolynomialRing_base,
15
14
  )
16
15
 
17
16
  __all__ = [
18
- "FastSchubertPolynomialRing",
19
- "FastSchubertPolynomial",
20
- "FastSchubertPolynomialRing_base",
21
- "FastDoubleSchubertPolynomialRing",
22
17
  "FastDoubleSchubertPolynomial",
18
+ "FastDoubleSchubertPolynomialRing",
23
19
  "FastDoubleSchubertPolynomialRing_base",
20
+ "FastQuantumDoubleSchubertPolynomialRing",
24
21
  "FastQuantumSchubertPolynomialRing",
25
- "FastQuantumDoubleSchubertPolynomialRing",
22
+ "FastSchubertPolynomial",
23
+ "FastSchubertPolynomialRing",
24
+ "FastSchubertPolynomialRing_base",
26
25
  ]