schubmult 1.3.5__tar.gz → 1.3.6__tar.gz

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 (31) hide show
  1. {schubmult-1.3.5 → schubmult-1.3.6}/PKG-INFO +1 -1
  2. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/perm_lib.py +13 -0
  3. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q/schubmult_q.py +1 -2
  4. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_yz/schubmult_q_yz.py +83 -10
  5. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/PKG-INFO +1 -1
  6. {schubmult-1.3.5 → schubmult-1.3.6}/setup.py +1 -1
  7. {schubmult-1.3.5 → schubmult-1.3.6}/LICENSE +0 -0
  8. {schubmult-1.3.5 → schubmult-1.3.6}/README.md +0 -0
  9. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/__init__.py +0 -0
  10. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_double/__init__.py +0 -0
  11. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_double/__main__.py +0 -0
  12. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_double/schubmult_double.py +0 -0
  13. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_py/__init__.py +0 -0
  14. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_py/__main__.py +0 -0
  15. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_py/schubmult_py.py +0 -0
  16. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q/__init__.py +0 -0
  17. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q/__main__.py +0 -0
  18. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_double/__init__.py +0 -0
  19. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_double/__main__.py +0 -0
  20. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_double/schubmult_q_double.py +0 -0
  21. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_yz/__init__.py +0 -0
  22. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_q_yz/__main__.py +0 -0
  23. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_yz/__init__.py +0 -0
  24. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_yz/__main__.py +0 -0
  25. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult/schubmult_yz/schubmult_yz.py +0 -0
  26. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/SOURCES.txt +0 -0
  27. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/dependency_links.txt +0 -0
  28. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/entry_points.txt +0 -0
  29. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/requires.txt +0 -0
  30. {schubmult-1.3.5 → schubmult-1.3.6}/schubmult.egg-info/top_level.txt +0 -0
  31. {schubmult-1.3.5 → schubmult-1.3.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: schubmult
3
- Version: 1.3.5
3
+ Version: 1.3.6
4
4
  Summary: Computing Littlewood-Richardson coefficients of Schubert polynomials
5
5
  Home-page: https://github.com/matthematics/schubmult
6
6
  Author: Matt Samuel
@@ -139,6 +139,19 @@ def elem_sym_perms(orig_perm,p,k):
139
139
  up_perm_list = perm_list
140
140
  return total_list
141
141
 
142
+ def strict_theta(u):
143
+ ret = [*trimcode(u)]
144
+ did_one = True
145
+ while did_one:
146
+ did_one = False
147
+ for i in range(len(ret)-2,-1,-1):
148
+ if ret[i+1]!=0 and ret[i] <= ret[i+1]:
149
+ ret[i], ret[i+1] = ret[i+1] + 1, ret[i]
150
+ did_one = True
151
+ break
152
+ while len(ret)>0 and ret[-1] == 0:
153
+ ret.pop()
154
+ return ret
142
155
 
143
156
  def elem_sym_perms_q(orig_perm,p,k):
144
157
  total_list = [(orig_perm,0,1)]
@@ -21,8 +21,7 @@ for i in range(1,n):
21
21
  subs_dict[var2[i]] = sm
22
22
 
23
23
  def schubmult(perm_dict,v):
24
- vn1 = inverse(v)
25
- th = [len(v)-i for i in range(1,len(v)+1)]
24
+ th = strict_theta(inverse(v))
26
25
  mu = permtrim(uncode(th))
27
26
  vmu = permtrim(mulperm([*v],mu))
28
27
  #print(f"{th=} {mu=} {vmu=}")
@@ -1,5 +1,5 @@
1
1
  from schubmult.perm_lib import *
2
- from schubmult.schubmult_yz import compute_positive_rep
2
+ from schubmult.schubmult_yz import compute_positive_rep, posify
3
3
  from symengine import *
4
4
  import sys
5
5
 
@@ -15,7 +15,7 @@ var3 = symarray("z",100)
15
15
 
16
16
 
17
17
  def schubmult(perm_dict,v,var2=var2,var3=var3):
18
- th = [len(v)-i for i in range(1,len(v))]
18
+ th = strict_theta(inverse(v))
19
19
  mu = permtrim(uncode(th))
20
20
  vmu = permtrim(mulperm([*v],mu))
21
21
  inv_vmu = inv(vmu)
@@ -54,10 +54,64 @@ def schubmult(perm_dict,v,var2=var2,var3=var3):
54
54
  ret_dict = add_perm_dict({ep: vpathsums[ep].get(toget,0) for ep in vpathsums},ret_dict)
55
55
  return ret_dict
56
56
 
57
+ q_var2 = q_var.tolist()
58
+
59
+ def sum_q_dict(q_dict1,q_dict2):
60
+ ret = {**q_dict1}
61
+ for key in q_dict2:
62
+ ret[key] = ret.get(key,0) + q_dict2[key]
63
+ return ret
64
+
65
+ def mul_q_dict(q_dict1,q_dict2):
66
+ ret = {}
67
+ for key1 in q_dict1:
68
+ for key2 in q_dict2:
69
+ key3 = key1*key2
70
+ ret[key3] = ret.get(key3,0) + q_dict1[key1]*q_dict2[key2]
71
+ return ret
72
+
73
+ def factor_out_q_keep_factored(poly):
74
+ ret = {}
75
+ if str(poly).find("q") == -1:
76
+ ret[1] = poly
77
+ return ret
78
+ elif poly in q_var2:
79
+ ret[poly] = 1
80
+ return ret
81
+ elif isinstance(poly,Add):
82
+ ag = poly.args
83
+ ret = factor_out_q_keep_factored(ag[0])
84
+ for i in range(1,len(ag)):
85
+ ret = sum_q_dict(ret,factor_out_q_keep_factored(ag[i]))
86
+ return ret
87
+ elif isinstance(poly,Mul):
88
+ ag = poly.args
89
+ ret = factor_out_q_keep_factored(ag[0])
90
+ for i in range(1,len(ag)):
91
+ ret = mul_q_dict(ret,factor_out_q_keep_factored(ag[i]))
92
+ return ret
93
+ elif isinstance(poly,Pow):
94
+ base = poly.args[0]
95
+ exponent = int(poly.args[1])
96
+ #print(f"exponent {exponent}")
97
+ work_val = factor_out_q_keep_factored(base)
98
+ ret = {1: 1}
99
+ while exponent > 0:
100
+ if exponent % 2 == 1:
101
+ if ret == {1: 1}:
102
+ ret = {**work_val}
103
+ else:
104
+ ret = mul_q_dict(ret,work_val)
105
+ exponent -= 1
106
+ else:
107
+ work_val = mul_q_dict(work_val,work_val)
108
+ exponent //= 2
109
+ return ret
110
+ return ret
111
+
57
112
  def factor_out_q(poly):
58
113
  coeff_dict = expand(poly).as_coefficients_dict()
59
- ret = {}
60
- q_var2 = q_var.tolist()
114
+ ret = {}
61
115
  for key in coeff_dict:
62
116
  coeff = coeff_dict[key]
63
117
  if coeff == 0:
@@ -92,7 +146,10 @@ def factor_out_q(poly):
92
146
 
93
147
  ret[q_part] = ret.get(q_part,0) + yz_part
94
148
  return ret
95
-
149
+
150
+ var2_t = tuple(var2.tolist())
151
+ var3_t = tuple(var3.tolist())
152
+
96
153
  def main():
97
154
  global var2
98
155
  try:
@@ -179,19 +236,35 @@ def main():
179
236
  notint = True
180
237
  val2 = 0
181
238
  if display_positive:
182
- q_dict = factor_out_q(val)
239
+ q_dict = factor_out_q_keep_factored(val)
183
240
  for q_part in q_dict:
184
241
  #print(f"{q_part=} {q_dict[q_part]=}")
185
242
  try:
186
243
  val2 += q_part*int(q_dict[q_part])
187
244
  except Exception:
188
245
  try:
189
- val2 += q_part*compute_positive_rep(q_dict[q_part],var2,var3,msg,False)
190
- except TypeError:
191
- print(f"error; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {check_coeff_dict.get(perm,0)=}")
246
+ if len(perms) == 2 and q_part == 1:
247
+ u = permtrim([*perms[0]])
248
+ v = permtrim([*perms[1]])
249
+ val2 += posify(q_dict[q_part],tuple(u),tuple(v),perm,var2_t,var3_t,msg,False)
250
+ elif len(perms) == 2 and q_part in q_var2:
251
+ i = q_var2.index(q_part)
252
+ u = permtrim([*perms[0]])
253
+ v = permtrim([*perms[1]])
254
+ #print(f"{u=} {v=} {q_part=} {q_dict[q_part]=}")
255
+ if i<len(u) and i<len(v) and u[i-1]>u[i] and v[i-1]>v[i]:
256
+ u[i], u[i-1] = u[i-1], u[i]
257
+ v[i], v[i-1] = v[i-1], v[i]
258
+ #print(f"new {u=} {v=}")
259
+ val2 += q_part*posify(q_dict[q_part],tuple(permtrim(u)),tuple(permtrim(v)),perm,var2_t,var3_t,msg,False)
260
+ else:
261
+ val2 += q_part*compute_positive_rep(q_dict[q_part],var2_t,var3_t,msg,False)
262
+ except Exception as e:
263
+ print(f"error; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {coeff_dict.get(perm,0)=}")
264
+ print(f"Exception: {e}")
192
265
  exit(1)
193
266
  if check and expand(val - val2)!=0:
194
- print(f"error; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {check_coeff_dict.get(perm,0)=}")
267
+ print(f"error: value not equal; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {coeff_dict.get(perm,0)=}")
195
268
  exit(1)
196
269
  val = val2
197
270
  if val!=0:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: schubmult
3
- Version: 1.3.5
3
+ Version: 1.3.6
4
4
  Summary: Computing Littlewood-Richardson coefficients of Schubert polynomials
5
5
  Home-page: https://github.com/matthematics/schubmult
6
6
  Author: Matt Samuel
@@ -6,7 +6,7 @@ long_description = (this_directory / "README.md").read_text()
6
6
 
7
7
  setup(
8
8
  name="schubmult",
9
- version="1.3.5",
9
+ version="1.3.6",
10
10
  description="Computing Littlewood-Richardson coefficients of Schubert polynomials",
11
11
  long_description=long_description,
12
12
  long_description_content_type='text/markdown',
File without changes
File without changes
File without changes