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,37 +1,72 @@
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
+ 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
- def E(p, k, varl=var_y[1:]):
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=var_x, var_y=var_y, q_var=q_var):
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
- elif isinstance(poly, Mul):
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
- elif isinstance(poly, Pow):
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
- elif isinstance(poly, Add):
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
- else:
75
- ret = {}
76
- for perm in coeff_dict:
77
- ret[perm] = poly * coeff_dict[perm]
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
- if th[index] - vdiff > mx_th:
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, 0
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=var_x, var_y=var2, q_var=q_var, coeff=1):
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
- if th[index] - vdiff > mx_th:
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, min(mx_th, (inv_mu - (inv_up - inv_u)) - inv_vmu), th[index], q_var
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, 0
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
- if th[index] - vdiff > mx_th:
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, 0
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
- if th[index] - vdiff > mx_th:
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
- if th[index + 1] - vdiff > mx_th1:
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, 0
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
- elif poly in q_var2:
464
+ if poly in _vars.q_var:
431
465
  ret[poly] = 1
432
466
  return ret
433
- elif isinstance(poly, Add):
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
- elif isinstance(poly, Mul):
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
- elif isinstance(poly, Pow):
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 i in range(exponent - 1):
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 q_var2:
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 q_var2:
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 q_var2:
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
- if key in q_var2:
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