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.
Files changed (40) hide show
  1. schubmult/__init__.py +1 -1
  2. schubmult/_base_argparse.py +42 -8
  3. schubmult/_tests.py +24 -0
  4. schubmult/perm_lib.py +52 -112
  5. schubmult/sage_integration/__init__.py +13 -13
  6. schubmult/sage_integration/_fast_double_schubert_polynomial_ring.py +139 -118
  7. schubmult/sage_integration/_fast_schubert_polynomial_ring.py +88 -49
  8. schubmult/sage_integration/_indexing.py +35 -32
  9. schubmult/schubmult_double/__init__.py +6 -12
  10. schubmult/schubmult_double/__main__.py +2 -1
  11. schubmult/schubmult_double/_funcs.py +245 -281
  12. schubmult/schubmult_double/_script.py +128 -70
  13. schubmult/schubmult_py/__init__.py +5 -3
  14. schubmult/schubmult_py/__main__.py +2 -1
  15. schubmult/schubmult_py/_funcs.py +68 -23
  16. schubmult/schubmult_py/_script.py +40 -58
  17. schubmult/schubmult_q/__init__.py +3 -7
  18. schubmult/schubmult_q/__main__.py +2 -1
  19. schubmult/schubmult_q/_funcs.py +41 -60
  20. schubmult/schubmult_q/_script.py +39 -30
  21. schubmult/schubmult_q_double/__init__.py +5 -11
  22. schubmult/schubmult_q_double/__main__.py +2 -1
  23. schubmult/schubmult_q_double/_funcs.py +99 -66
  24. schubmult/schubmult_q_double/_script.py +209 -150
  25. schubmult-2.0.4.dist-info/METADATA +542 -0
  26. schubmult-2.0.4.dist-info/RECORD +30 -0
  27. {schubmult-2.0.2.dist-info → schubmult-2.0.4.dist-info}/WHEEL +1 -1
  28. schubmult-2.0.4.dist-info/entry_points.txt +5 -0
  29. {schubmult-2.0.2.dist-info → schubmult-2.0.4.dist-info}/top_level.txt +0 -1
  30. schubmult/schubmult_double/_vars.py +0 -18
  31. schubmult/schubmult_py/_vars.py +0 -3
  32. schubmult/schubmult_q/_vars.py +0 -18
  33. schubmult/schubmult_q_double/_vars.py +0 -21
  34. schubmult-2.0.2.dist-info/METADATA +0 -455
  35. schubmult-2.0.2.dist-info/RECORD +0 -36
  36. schubmult-2.0.2.dist-info/entry_points.txt +0 -5
  37. tests/__init__.py +0 -0
  38. tests/test_fast_double_schubert.py +0 -145
  39. tests/test_fast_schubert.py +0 -38
  40. {schubmult-2.0.2.dist-info → schubmult-2.0.4.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,6 @@
1
1
  import sys
2
+
2
3
  from ._script import main
3
4
 
4
5
  if __name__ == "__main__":
5
- sys.exit(main())
6
+ sys.exit(main(sys.argv))
@@ -1,54 +1,39 @@
1
- from ._vars import (
2
- var_x,
3
- )
4
- from symengine import Add, Mul, Pow
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
- code,
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
- def single_variable(coeff_dict, varnum, var_q=q_var):
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
- elif isinstance(poly, Mul):
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
- elif isinstance(poly, Pow):
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
- elif isinstance(poly, Add):
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
- else:
88
- ret = {}
89
- for perm in coeff_dict:
90
- ret[perm] = poly * coeff_dict[perm]
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
- if th[index] - vdiff > mx_th:
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
- if th[index + 1] - vdiff > mx_th1:
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
- if th[index] - vdiff > mx_th:
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
 
@@ -1,30 +1,33 @@
1
- from ._funcs import (
2
- schubmult,
3
- schubmult_db,
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
- q_vector,
12
+ longest_element,
13
+ mulperm,
18
14
  omega,
19
- count_less_than,
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
- print(f"{str(trimcode(perm))} {formatter(val)}")
87
+ raw_result_dict[tuple(trimcode(perm))] = val
88
+ if formatter:
89
+ print(f"{trimcode(perm)!s} {formatter(val)}")
85
90
  else:
86
- print(f"{str(perm)} {formatter(val)}")
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
- mul_exp = sympify(mulstring)
148
- coeff_dict = mult_poly(coeff_dict, mul_exp)
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
- main()
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
- "mult_poly",
14
- "factor_out_q_keep_factored",
15
- "schubpoly_quantum"
8
+ "schubpoly_quantum",
16
9
  ]
10
+
@@ -1,5 +1,6 @@
1
1
  import sys
2
+
2
3
  from ._script import main
3
4
 
4
5
  if __name__ == "__main__":
5
- sys.exit(main())
6
+ sys.exit(main(sys.argv))