schubmult 2.0.1__py3-none-any.whl → 2.0.3__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 (38) hide show
  1. schubmult/__init__.py +1 -1
  2. schubmult/_base_argparse.py +35 -6
  3. schubmult/_tests.py +9 -0
  4. schubmult/sage_integration/__init__.py +1 -0
  5. schubmult/sage_integration/_fast_double_schubert_polynomial_ring.py +68 -11
  6. schubmult/sage_integration/_fast_schubert_polynomial_ring.py +48 -6
  7. schubmult/sage_integration/_indexing.py +11 -4
  8. schubmult/schubmult_double/__init__.py +6 -2
  9. schubmult/schubmult_double/__main__.py +1 -1
  10. schubmult/schubmult_double/_funcs.py +112 -32
  11. schubmult/schubmult_double/_script.py +109 -51
  12. schubmult/schubmult_py/__init__.py +5 -2
  13. schubmult/schubmult_py/__main__.py +1 -1
  14. schubmult/schubmult_py/_funcs.py +54 -9
  15. schubmult/schubmult_py/_script.py +33 -52
  16. schubmult/schubmult_q/__init__.py +1 -0
  17. schubmult/schubmult_q/__main__.py +1 -1
  18. schubmult/schubmult_q/_funcs.py +21 -37
  19. schubmult/schubmult_q/_script.py +19 -16
  20. schubmult/schubmult_q_double/__init__.py +5 -2
  21. schubmult/schubmult_q_double/__main__.py +1 -1
  22. schubmult/schubmult_q_double/_funcs.py +57 -24
  23. schubmult/schubmult_q_double/_script.py +200 -139
  24. {schubmult-2.0.1.dist-info → schubmult-2.0.3.dist-info}/METADATA +4 -4
  25. schubmult-2.0.3.dist-info/RECORD +30 -0
  26. {schubmult-2.0.1.dist-info → schubmult-2.0.3.dist-info}/WHEEL +1 -1
  27. schubmult-2.0.3.dist-info/entry_points.txt +5 -0
  28. {schubmult-2.0.1.dist-info → schubmult-2.0.3.dist-info}/top_level.txt +0 -1
  29. schubmult/schubmult_double/_vars.py +0 -18
  30. schubmult/schubmult_py/_vars.py +0 -3
  31. schubmult/schubmult_q/_vars.py +0 -18
  32. schubmult/schubmult_q_double/_vars.py +0 -21
  33. schubmult-2.0.1.dist-info/RECORD +0 -36
  34. schubmult-2.0.1.dist-info/entry_points.txt +0 -5
  35. tests/__init__.py +0 -0
  36. tests/test_fast_double_schubert.py +0 -145
  37. tests/test_fast_schubert.py +0 -38
  38. {schubmult-2.0.1.dist-info → schubmult-2.0.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,5 @@
1
- from ._funcs import (
2
- mult_poly,
3
- schubmult,
4
- )
1
+ from schubmult.schubmult_py._funcs import mult_poly, schubmult, schub_coprod
2
+ import sys
5
3
  from symengine import sympify
6
4
  from schubmult._base_argparse import schub_argparse
7
5
  from schubmult.perm_lib import (
@@ -9,16 +7,18 @@ from schubmult.perm_lib import (
9
7
  theta,
10
8
  permtrim,
11
9
  inv,
12
- mulperm,
13
- code,
14
10
  uncode,
15
11
  trimcode,
16
12
  )
17
13
 
18
14
 
19
- def main():
15
+ def main(argv=None):
16
+ if argv is None:
17
+ argv = sys.argv
20
18
  try:
21
- args, formatter = schub_argparse("schubmult_py", "Compute products of ordinary Schubert polynomials")
19
+ args, formatter = schub_argparse(
20
+ "schubmult_py", "Compute products of ordinary Schubert polynomials", argv=argv[1:]
21
+ )
22
22
 
23
23
  mult = args.mult
24
24
  mulstring = args.mulstring
@@ -36,55 +36,30 @@ def main():
36
36
  ascode = args.ascode
37
37
  pr = args.pr
38
38
  coprod = args.coprod
39
-
39
+ raw_result_dict = {}
40
40
  if coprod:
41
41
  if ascode:
42
42
  perms[0] = tuple(permtrim(uncode(perms[0])))
43
43
  pos = [*perms[1]]
44
44
  pos.sort()
45
- mperm = perms[0]
45
+ mperm = tuple(permtrim(perms[0]))
46
46
 
47
- cd = code(mperm)
48
- perms[0] = mperm
47
+ coeff_dict = schub_coprod(mperm, pos)
49
48
 
50
- while cd[-1] == 0:
51
- cd.pop()
52
- k = len(pos)
53
- n = len(perms[0])
54
- kcd = [pos[i] - i - 1 for i in range(len(pos))] + [n + 1 - k for i in range(k, n)]
55
- N = len(kcd)
56
- kperm = inverse(uncode(kcd))
57
- coeff_dict = {tuple(permtrim(kperm)): 1}
58
- coeff_dict = schubmult(coeff_dict, tuple(permtrim([*perms[0]])))
59
-
60
- inv_kperm = inv(kperm)
61
- inverse_kperm = inverse(kperm)
62
- if pr:
63
- for perm, val in coeff_dict.items():
64
- downperm = mulperm(list(perm), inverse_kperm)
65
- if inv(downperm) == inv(perm) - inv_kperm:
66
- flag = True
67
- for i in range(N):
68
- if downperm[i] > N:
69
- flag = False
70
- break
71
- if not flag:
72
- continue
73
- firstperm = downperm[0:N]
74
- secondperm = [downperm[i] - N for i in range(N, len(downperm))]
75
- if val != 0:
76
- # firstcode = code(firstperm)
77
- # while len(firstcode)>0 and firstcode[-1] == 0:
78
- # firstcode.pop()
79
- # secondcode = code(secondperm)
80
- # while len(secondcode)>0 and secondcode[-1] == 0:
81
- # secondcode.pop()
82
- if ascode:
49
+ if pr or formatter is None:
50
+ for firstperm, secondperm in coeff_dict:
51
+ val = coeff_dict[(firstperm, secondperm)]
52
+ if val != 0:
53
+ if ascode:
54
+ if formatter is None:
55
+ raw_result_dict[(firstperm, secondperm)] = val
56
+ else:
83
57
  print(f"{val} {trimcode(firstperm)} {trimcode(secondperm)}")
58
+ else:
59
+ if formatter is None:
60
+ raw_result_dict[(firstperm, secondperm)] = val
84
61
  else:
85
- print(
86
- f"{val} {tuple(permtrim(firstperm))} {tuple(permtrim(secondperm))}"
87
- )
62
+ print(f"{val} {firstperm} {secondperm}")
88
63
  else:
89
64
  if ascode:
90
65
  for i in range(len(perms)):
@@ -100,16 +75,22 @@ def main():
100
75
  mul_exp = sympify(mulstring)
101
76
  coeff_dict = mult_poly(coeff_dict, mul_exp)
102
77
 
103
- if pr:
78
+ if pr or formatter is None:
104
79
  for perm, val in coeff_dict.items():
105
80
  if val != 0:
106
81
  if ascode:
107
- print(f"{val} {trimcode(perm)}")
82
+ raw_result_dict[tuple(trimcode(perm))] = val
83
+ if formatter:
84
+ print(f"{val} {trimcode(perm)}")
108
85
  else:
109
- print(f"{val} {perm}")
86
+ raw_result_dict[tuple(perm)] = val
87
+ if formatter:
88
+ print(f"{val} {perm}")
89
+ if formatter is None:
90
+ return raw_result_dict
110
91
  except BrokenPipeError:
111
92
  pass
112
93
 
113
94
 
114
95
  if __name__ == "__main__":
115
- main()
96
+ main(sys.argv)
@@ -10,3 +10,4 @@ __all__ = [
10
10
  "schubmult_db",
11
11
  "mult_poly"
12
12
  ]
13
+
@@ -2,4 +2,4 @@ import sys
2
2
  from ._script import main
3
3
 
4
4
  if __name__ == "__main__":
5
- sys.exit(main())
5
+ sys.exit(main(sys.argv))
@@ -1,7 +1,4 @@
1
- from ._vars import (
2
- var_x,
3
- )
4
- from symengine import Add, Mul, Pow
1
+ from symengine import Add, Mul, Pow, symarray
5
2
  from schubmult.perm_lib import (
6
3
  elem_sym_perms_q,
7
4
  add_perm_dict,
@@ -14,41 +11,28 @@ from schubmult.perm_lib import (
14
11
  mulperm,
15
12
  code,
16
13
  uncode,
17
- double_elem_sym_q,
18
- q_var,
14
+ double_elem_sym_q,
19
15
  )
20
16
 
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
17
+ from functools import cached_property
18
+
19
+
20
+ class _gvars:
21
+ @cached_property
22
+ def n(self):
23
+ return 100
24
+
25
+ @cached_property
26
+ def var_x(self):
27
+ return tuple(symarray("x", self.n).tolist())
28
+
29
+ @cached_property
30
+ def q_var(self):
31
+ return tuple(symarray("q", self.n).tolist())
49
32
 
33
+ _vars = _gvars()
50
34
 
51
- def single_variable(coeff_dict, varnum, var_q=q_var):
35
+ def single_variable(coeff_dict, varnum, var_q=_vars.q_var):
52
36
  ret = {}
53
37
  for u in coeff_dict:
54
38
  new_perms_k = elem_sym_perms_q(u, 1, varnum, var_q)
@@ -64,7 +48,7 @@ def single_variable(coeff_dict, varnum, var_q=q_var):
64
48
  return ret
65
49
 
66
50
 
67
- def mult_poly(coeff_dict, poly, var_x=var_x, var_q=q_var):
51
+ def mult_poly(coeff_dict, poly, var_x=_vars.var_x, var_q=_vars.q_var):
68
52
  if poly in var_x:
69
53
  return single_variable(coeff_dict, var_x.index(poly), var_q=var_q)
70
54
  elif isinstance(poly, Mul):
@@ -90,7 +74,7 @@ def mult_poly(coeff_dict, poly, var_x=var_x, var_q=q_var):
90
74
  ret[perm] = poly * coeff_dict[perm]
91
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))
@@ -1,7 +1,6 @@
1
- from ._funcs import (
1
+ from schubmult.schubmult_q._funcs import (
2
2
  schubmult,
3
3
  schubmult_db,
4
- mult_poly,
5
4
  )
6
5
  from symengine import sympify
7
6
  from schubmult._base_argparse import schub_argparse
@@ -22,9 +21,10 @@ from schubmult.perm_lib import (
22
21
  )
23
22
  import numpy as np
24
23
  from schubmult.schubmult_q_double import factor_out_q_keep_factored
25
-
24
+ import sys
26
25
 
27
26
  def _display_full(coeff_dict, args, formatter):
27
+ raw_result_dict = {}
28
28
  ascode = args.ascode
29
29
  parabolic_index = [int(s) for s in args.parabolic]
30
30
  parabolic = len(parabolic_index) != 0
@@ -81,25 +81,25 @@ def _display_full(coeff_dict, args, formatter):
81
81
  val = sympify(coeff_dict[perm]).expand()
82
82
  if val != 0:
83
83
  if ascode:
84
+
84
85
  print(f"{str(trimcode(perm))} {formatter(val)}")
85
86
  else:
86
87
  print(f"{str(perm)} {formatter(val)}")
88
+ return raw_result_dict
87
89
 
88
90
 
89
- def main():
91
+ def main(argv=None):
92
+ if argv is None:
93
+ argv = sys.argv
90
94
  try:
91
95
  args, formatter = schub_argparse(
92
96
  "schubmult_q",
93
97
  "Compute products of quantum Schubert polynomials",
98
+ argv=argv[1:],
94
99
  quantum=True,
95
100
  )
96
101
 
97
- mulstring = ""
98
-
99
- mult = False
100
- if args.mult is not None:
101
- mult = True
102
- mulstring = " ".join(args.mult)
102
+
103
103
 
104
104
  perms = args.perms
105
105
 
@@ -143,15 +143,18 @@ def main():
143
143
  for perm in perms[1:]:
144
144
  coeff_dict = schubmult(coeff_dict, tuple(permtrim([*perm])))
145
145
 
146
- if mult:
147
- mul_exp = sympify(mulstring)
148
- coeff_dict = mult_poly(coeff_dict, mul_exp)
146
+ # if mult:
147
+ # mul_exp = sympify(mulstring)
148
+ # coeff_dict = mult_poly(coeff_dict, mul_exp)
149
149
 
150
- if pr:
151
- _display_full(coeff_dict, args, formatter)
150
+ if pr or formatter is None:
151
+ raw_result_dict = _display_full(coeff_dict, args, formatter)
152
+ if formatter is None:
153
+ return raw_result_dict
152
154
  except BrokenPipeError:
153
155
  pass
154
156
 
155
157
 
156
158
  if __name__ == "__main__":
157
- main()
159
+ import sys
160
+ main(sys.argv)
@@ -2,7 +2,8 @@ from ._funcs import (
2
2
  schubmult,
3
3
  schubmult_db,
4
4
  mult_poly,
5
- factor_out_q_keep_factored
5
+ factor_out_q_keep_factored,
6
+ schubpoly_quantum
6
7
  )
7
8
 
8
9
 
@@ -10,5 +11,7 @@ __all__ = [
10
11
  "schubmult",
11
12
  "schubmult_db",
12
13
  "mult_poly",
13
- "factor_out_q_keep_factored"
14
+ "factor_out_q_keep_factored",
15
+ "schubpoly_quantum"
14
16
  ]
17
+
@@ -2,4 +2,4 @@ import sys
2
2
  from ._script import main
3
3
 
4
4
  if __name__ == "__main__":
5
- sys.exit(main())
5
+ sys.exit(main(sys.argv))
@@ -1,11 +1,13 @@
1
- from ._vars import (
2
- var_y,
3
- var_x,
4
- var2,
5
- var3,
6
- q_var2,
7
- )
8
- from symengine import Add, Mul, Pow, expand
1
+ # from ._vars import (
2
+ # var_y,
3
+ # var_x,
4
+ # var2,
5
+ # var3,
6
+ # q_var2,
7
+ # )
8
+ import schubmult.schubmult_double as norm_yz
9
+
10
+ from symengine import Add, Mul, Pow, expand, symarray
9
11
  from schubmult.perm_lib import (
10
12
  elem_sym_perms_q,
11
13
  add_perm_dict,
@@ -22,16 +24,47 @@ from schubmult.perm_lib import (
22
24
  elem_sym_perms_q_op,
23
25
  elem_sym_func_q,
24
26
  call_zvars,
25
- q_var,
26
27
  )
27
- import schubmult.schubmult_double as norm_yz
28
+ from functools import cached_property
29
+
30
+ class _gvars:
31
+ @cached_property
32
+ def n(self):
33
+ return 100
34
+
35
+ # @cached_property
36
+ # def fvar(self):
37
+ # return 100
38
+
39
+ @cached_property
40
+ def var1(self):
41
+ return tuple(symarray("x", self.n).tolist())
42
+
43
+ @cached_property
44
+ def var2(self):
45
+ return tuple(symarray("y", self.n).tolist())
46
+
47
+ @cached_property
48
+ def var3(self):
49
+ return tuple(symarray("z", self.n).tolist())
50
+
51
+ @cached_property
52
+ def q_var(self):
53
+ return tuple(symarray("q", self.n).tolist())
54
+
55
+ @cached_property
56
+ def var_r(self):
57
+ return symarray("r", 100)
58
+
59
+
60
+ _vars = _gvars()
28
61
 
29
62
 
30
- def E(p, k, varl=var_y[1:]):
63
+ def E(p, k, varl=_vars.var2[1:],var_x=_vars.var1):
31
64
  return elem_sym_poly_q(p, k, var_x[1:], varl)
32
65
 
33
66
 
34
- def single_variable(coeff_dict, varnum, var2=var2, q_var=q_var):
67
+ def single_variable(coeff_dict, varnum, var2=_vars.var2, q_var=_vars.q_var):
35
68
  ret = {}
36
69
  for u in coeff_dict:
37
70
  if varnum - 1 < len(u):
@@ -51,7 +84,7 @@ def single_variable(coeff_dict, varnum, var2=var2, q_var=q_var):
51
84
  return ret
52
85
 
53
86
 
54
- def mult_poly(coeff_dict, poly, var_x=var_x, var_y=var_y, q_var=q_var):
87
+ def mult_poly(coeff_dict, poly, var_x=_vars.var1, var_y=_vars.var2, q_var=_vars.q_var):
55
88
  if poly in var_x:
56
89
  return single_variable(coeff_dict, var_x.index(poly), var_y, q_var)
57
90
  elif isinstance(poly, Mul):
@@ -78,7 +111,7 @@ def mult_poly(coeff_dict, poly, var_x=var_x, var_y=var_y, q_var=q_var):
78
111
  return ret
79
112
 
80
113
 
81
- def nil_hecke(perm_dict, v, n, var2=var2, var3=var3):
114
+ def nil_hecke(perm_dict, v, n, var2=_vars.var2, var3=_vars.var3):
82
115
  if v == (1, 2):
83
116
  return perm_dict
84
117
  th = strict_theta(inverse(v))
@@ -129,7 +162,7 @@ def nil_hecke(perm_dict, v, n, var2=var2, var3=var3):
129
162
  return ret_dict
130
163
 
131
164
 
132
- def elem_sym_func_q_q(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2, q_var=q_var):
165
+ def elem_sym_func_q_q(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2, q_var=_vars.q_var):
133
166
  newk = k - udiff
134
167
  if newk < vdiff:
135
168
  return 0
@@ -151,7 +184,7 @@ def elem_sym_func_q_q(k, i, u1, u2, v1, v2, udiff, vdiff, varl1, varl2, q_var=q_
151
184
  return elem_sym_poly_q(newk - vdiff, newk, yvars, zvars, q_var)
152
185
 
153
186
 
154
- def schubpoly_quantum(v, var_x=var_x, var_y=var2, q_var=q_var, coeff=1):
187
+ def schubpoly_quantum(v, var_x=_vars.var1, var_y=_vars.var2, q_var=_vars.q_var, coeff=1):
155
188
  th = strict_theta(inverse(v))
156
189
  mu = permtrim(uncode(th))
157
190
  vmu = permtrim(mulperm([*v], mu))
@@ -206,7 +239,7 @@ def schubpoly_quantum(v, var_x=var_x, var_y=var2, q_var=q_var, coeff=1):
206
239
  return ret_dict[(1, 2)]
207
240
 
208
241
 
209
- def schubmult(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
242
+ def schubmult(perm_dict, v, var2=_vars.var2, var3=_vars.var3, q_var=_vars.q_var):
210
243
  if v == (1, 2):
211
244
  return perm_dict
212
245
  th = strict_theta(inverse(v))
@@ -267,7 +300,7 @@ def schubmult(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
267
300
  return ret_dict
268
301
 
269
302
 
270
- def schubmult_db(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
303
+ def schubmult_db(perm_dict, v, var2=_vars.var2, var3=_vars.var3, q_var=_vars.q_var):
271
304
  if v == (1, 2):
272
305
  return perm_dict
273
306
  th = medium_theta(inverse(v))
@@ -400,7 +433,7 @@ def schubmult_db(perm_dict, v, var2=var2, var3=var3, q_var=q_var):
400
433
  return ret_dict
401
434
 
402
435
 
403
- def div_diff(v, w, var2=var2, var3=var3):
436
+ def div_diff(v, w, var2=_vars.var2, var3=_vars.var3):
404
437
  coeff_dict = {v: 1}
405
438
  coeff_dict = norm_yz.schubmult_down(coeff_dict, w, var2, var3)
406
439
  return coeff_dict.get((1, 2), 0)
@@ -427,7 +460,7 @@ def factor_out_q_keep_factored(poly):
427
460
  if str(poly).find("q") == -1:
428
461
  ret[1] = poly
429
462
  return ret
430
- elif poly in q_var2:
463
+ elif poly in _vars.q_var:
431
464
  ret[poly] = 1
432
465
  return ret
433
466
  elif isinstance(poly, Add):
@@ -481,24 +514,24 @@ def factor_out_q(poly):
481
514
  for var_maybe_pow in key.args:
482
515
  if isinstance(var_maybe_pow, Pow):
483
516
  real_var = var_maybe_pow.args[0]
484
- if real_var in q_var2:
517
+ if real_var in _vars.q_var:
485
518
  q_part *= var_maybe_pow
486
519
  else:
487
520
  yz_part *= var_maybe_pow
488
521
  else:
489
522
  real_var = var_maybe_pow
490
- if real_var in q_var2:
523
+ if real_var in _vars.q_var:
491
524
  q_part *= var_maybe_pow
492
525
  else:
493
526
  yz_part *= var_maybe_pow
494
527
  elif isinstance(key, Pow):
495
528
  real_var = key.args[0]
496
- if real_var in q_var2:
529
+ if real_var in _vars.q_var:
497
530
  q_part *= key
498
531
  else:
499
532
  yz_part *= key
500
533
  else:
501
- if key in q_var2:
534
+ if key in _vars.q_var:
502
535
  q_part *= key
503
536
  else:
504
537
  yz_part *= key