schubmult 1.4.0__tar.gz → 1.4.2__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.
- {schubmult-1.4.0 → schubmult-1.4.2}/PKG-INFO +1 -1
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/perm_lib.py +91 -1
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_yz/schubmult_q_yz.py +42 -17
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_yz/schubmult_yz.py +64 -50
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/PKG-INFO +1 -1
- {schubmult-1.4.0 → schubmult-1.4.2}/setup.py +1 -1
- {schubmult-1.4.0 → schubmult-1.4.2}/LICENSE +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/README.md +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/__init__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_double/__init__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_double/__main__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_double/schubmult_double.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_py/__init__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_py/__main__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_py/schubmult_py.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q/__init__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q/__main__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q/schubmult_q.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_double/__init__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_double/__main__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_double/schubmult_q_double.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_yz/__init__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_yz/__main__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_yz/__init__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_yz/__main__.py +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/SOURCES.txt +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/dependency_links.txt +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/entry_points.txt +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/requires.txt +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/top_level.txt +0 -0
- {schubmult-1.4.0 → schubmult-1.4.2}/setup.cfg +0 -0
@@ -153,7 +153,7 @@ def elem_sym_perms_op(orig_perm,p,k):
|
|
153
153
|
up_perm2 = [*up_perm]
|
154
154
|
if len(up_perm2) < k + 1:
|
155
155
|
up_perm2 += [i+1 for i in range(len(up_perm2),k+2)]
|
156
|
-
pos_list = [i for i in range(k) if up_perm2
|
156
|
+
pos_list = [i for i in range(k) if getpermval(up_perm2,i) == getpermval(orig_perm,i)]
|
157
157
|
for j in range(last,len(up_perm2)):
|
158
158
|
for i in pos_list:
|
159
159
|
if has_bruhat_descent(up_perm2,i,j):
|
@@ -234,7 +234,97 @@ def elem_sym_perms_q_op(orig_perm,p,k,n):
|
|
234
234
|
up_perm_list = perm_list
|
235
235
|
return total_list
|
236
236
|
|
237
|
+
qvar_list = q_var.tolist()
|
237
238
|
|
239
|
+
def q_vector(q_exp):
|
240
|
+
ret = []
|
241
|
+
|
242
|
+
if q_exp == 1:
|
243
|
+
return ret
|
244
|
+
if q_exp in q_var:
|
245
|
+
i = qvar_list.index(q_exp)
|
246
|
+
ret = [0 for j in range(i-1)] + [1]
|
247
|
+
return ret
|
248
|
+
if isinstance(q_exp, Pow):
|
249
|
+
qv = q_exp.args[0]
|
250
|
+
expon = int(q_exp.args[1])
|
251
|
+
i = qvar_list.index(qv)
|
252
|
+
ret = [0 for j in range(i-1)] + [expon]
|
253
|
+
return ret
|
254
|
+
if isinstance(q_exp, Mul):
|
255
|
+
for a in q_exp.args:
|
256
|
+
v1 = q_vector(a)
|
257
|
+
v1 += [0 for i in range(len(v1),len(ret))]
|
258
|
+
ret += [0 for i in range(len(ret),len(v1))]
|
259
|
+
ret = [ret[i] + v1[i] for i in range(len(ret))]
|
260
|
+
return ret
|
261
|
+
|
262
|
+
return None
|
263
|
+
|
264
|
+
def omega(i,qv):
|
265
|
+
i = i - 1
|
266
|
+
if len(qv) == 0 or i > len(qv):
|
267
|
+
return 0
|
268
|
+
if i == 0:
|
269
|
+
if len(qv) == 1:
|
270
|
+
return 2*qv[0]
|
271
|
+
return 2*qv[0] - qv[1]
|
272
|
+
if i == len(qv):
|
273
|
+
return -qv[-1]
|
274
|
+
if i == len(qv) - 1:
|
275
|
+
return 2*qv[-1] - qv[-2]
|
276
|
+
return 2*qv[i] - qv[i-1] - qv[i+1]
|
277
|
+
|
278
|
+
def sg(i,w):
|
279
|
+
if i>=len(w) - 1 or w[i]<w[i+1]:
|
280
|
+
return 0
|
281
|
+
return 1
|
282
|
+
|
283
|
+
def reduce_q_coeff(u, v, w, qv):
|
284
|
+
for i in range(len(qv)):
|
285
|
+
if (i<len(u)-1 and u[i]>u[i+1] and (i>=len(v)-1 or v[i]<v[i+1]) and (i>=len(w)-1 or w[i]<w[i+1]) and sg(i,w) + omega(i+1,qv) == 1):
|
286
|
+
ret_u = [*u]
|
287
|
+
ret_u[i], ret_u[i+1] = ret_u[i+1], ret_u[i]
|
288
|
+
ret_w = [*w] + [j+1 for j in range(len(w),i+2)]
|
289
|
+
ret_w[i], ret_w[i+1] = ret_w[i+1], ret_w[i]
|
290
|
+
qv_ret = [*qv]
|
291
|
+
qv_ret[i] -= 1
|
292
|
+
return tuple(permtrim(ret_u)), v, tuple(permtrim(ret_w)), qv_ret, True
|
293
|
+
elif (i<len(v)-1 and v[i]>v[i+1] and (i>=len(u)-1 or u[i]<u[i+1]) and (i>=len(w)-1 or w[i]<w[i+1]) and sg(i,w) + omega(i+1,qv) == 1):
|
294
|
+
ret_v = [*v]
|
295
|
+
ret_v[i], ret_v[i+1] = ret_v[i+1], ret_v[i]
|
296
|
+
ret_w = [*w] + [j+1 for j in range(len(w),i+2)]
|
297
|
+
ret_w[i], ret_w[i+1] = ret_w[i+1], ret_w[i]
|
298
|
+
qv_ret = [*qv]
|
299
|
+
qv_ret[i] -= 1
|
300
|
+
return u, tuple(permtrim(ret_v)), tuple(permtrim(ret_w)), qv_ret, True
|
301
|
+
elif (i<len(u)-1 and u[i]>u[i+1] and i<len(v)-1 and v[i]>v[i+1] and sg(i,w)+omega(i+1,qv) == 2):
|
302
|
+
ret_u = [*u]
|
303
|
+
ret_u[i], ret_u[i+1] = ret_u[i+1], ret_u[i]
|
304
|
+
ret_w = [*w] + [j+1 for j in range(len(w),i+2)]
|
305
|
+
ret_w[i], ret_w[i+1] = ret_w[i+1], ret_w[i]
|
306
|
+
qv_ret = [*qv]
|
307
|
+
if i>=len(w)-1 or w[i]<w[i+1]:
|
308
|
+
qv_ret[i] -= 1
|
309
|
+
return tuple(permtrim(ret_u)), v, tuple(permtrim(ret_w)), qv_ret, True
|
310
|
+
elif i<len(u)-1 and u[i]>u[i+1] and (i>=len(v)-1 or v[i]<v[i+1]) and sg(i,w)==1 and omega(i+1,qv) == 0:
|
311
|
+
ret_u = [*u]
|
312
|
+
ret_u[i], ret_u[i+1] = ret_u[i+1], ret_u[i]
|
313
|
+
ret_w = [*w] + [j+1 for j in range(len(w),i+2)]
|
314
|
+
ret_w[i], ret_w[i+1] = ret_w[i+1], ret_w[i]
|
315
|
+
qv_ret = [*qv]
|
316
|
+
#print("Blop u")
|
317
|
+
return tuple(permtrim(ret_u)), v, tuple(permtrim(ret_w)), qv_ret, True
|
318
|
+
elif i<len(v)-1 and v[i]>v[i+1] and (i>=len(u)-1 or u[i]<u[i+1]) and sg(i,w) == 1 and omega(i+1,qv) == 0:
|
319
|
+
ret_v = [*v]
|
320
|
+
ret_v[i], ret_v[i+1] = ret_v[i+1], ret_v[i]
|
321
|
+
ret_w = [*w] + [j+1 for j in range(len(w),i+2)]
|
322
|
+
ret_w[i], ret_w[i+1] = ret_w[i+1], ret_w[i]
|
323
|
+
qv_ret = qv
|
324
|
+
#print("Blop v")
|
325
|
+
return u, tuple(permtrim(ret_v)), tuple(permtrim(ret_w)), qv_ret, True
|
326
|
+
return u, v, w, qv, False
|
327
|
+
|
238
328
|
# perms and inversion diff
|
239
329
|
def kdown_perms(perm,monoperm,p,k):
|
240
330
|
inv_m = inv(monoperm)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from schubmult.perm_lib import *
|
2
2
|
from schubmult.schubmult_yz import compute_positive_rep, posify
|
3
|
+
import schubmult.schubmult_yz as norm_yz
|
3
4
|
from symengine import *
|
4
5
|
import sys
|
5
6
|
|
@@ -242,6 +243,11 @@ def schubmult_db(perm_dict,v,var2=var2,var3=var3):
|
|
242
243
|
ret_dict = add_perm_dict({ep: vpathsums[ep].get(toget,0) for ep in vpathsums},ret_dict)
|
243
244
|
return ret_dict
|
244
245
|
|
246
|
+
def div_diff(v,w,var2=var2,var3=var3):
|
247
|
+
coeff_dict = {v: 1}
|
248
|
+
coeff_dict = norm_yz.schubmult_down(coeff_dict,w,var2,var3)
|
249
|
+
return coeff_dict.get((1,2),0)
|
250
|
+
|
245
251
|
q_var2 = q_var.tolist()
|
246
252
|
|
247
253
|
def sum_q_dict(q_dict1,q_dict2):
|
@@ -359,6 +365,7 @@ def main():
|
|
359
365
|
ascode = False
|
360
366
|
coprod = False
|
361
367
|
nilhecke = False
|
368
|
+
nilhecke_apply = False
|
362
369
|
check = True
|
363
370
|
msg = False
|
364
371
|
just_nil = False
|
@@ -408,6 +415,10 @@ def main():
|
|
408
415
|
nilhecke = True
|
409
416
|
just_nil = True
|
410
417
|
continue
|
418
|
+
if s == "-nil-hecke-apply":
|
419
|
+
nilhecke_apply = True
|
420
|
+
just_nil = True
|
421
|
+
continue
|
411
422
|
if s == "--version":
|
412
423
|
print(f"Python version {sys.version}")
|
413
424
|
exit(0)
|
@@ -443,7 +454,13 @@ def main():
|
|
443
454
|
|
444
455
|
if nilhecke:
|
445
456
|
coeff_dict = nil_hecke({(1,2): 1},perms[0],nil_N)
|
446
|
-
rep = ("y","x")
|
457
|
+
rep = ("y","x")
|
458
|
+
elif nilhecke_apply:
|
459
|
+
coeff_dict0 = nil_hecke({(1,2): 1},perms[0],nil_N,var2,var2)
|
460
|
+
coeff_dict = {(1,2): 0}
|
461
|
+
for v in coeff_dict0:
|
462
|
+
coeff_dict[(1,2)] += coeff_dict0[v]*div_diff(v,perms[1],var2,var3)
|
463
|
+
rep = ("y","x")
|
447
464
|
else:
|
448
465
|
coeff_dict = {perms[0]: 1}
|
449
466
|
for perm in perms[1:]:
|
@@ -491,22 +508,28 @@ def main():
|
|
491
508
|
val2 += q_part*int(q_dict[q_part])
|
492
509
|
except Exception:
|
493
510
|
try:
|
494
|
-
if len(perms) == 2
|
495
|
-
u = permtrim([*perms[0]])
|
496
|
-
v = permtrim([*perms[1]])
|
497
|
-
|
498
|
-
|
499
|
-
i = q_var2.index(q_part)
|
500
|
-
u = permtrim([*perms[0]])
|
501
|
-
v = permtrim([*perms[1]])
|
502
|
-
#print(f"{u=} {v=} {q_part=} {q_dict[q_part]=}")
|
503
|
-
if i<len(u) and i<len(v) and u[i-1]>u[i] and v[i-1]>v[i]:
|
504
|
-
u[i], u[i-1] = u[i-1], u[i]
|
505
|
-
v[i], v[i-1] = v[i-1], v[i]
|
506
|
-
#print(f"new {u=} {v=}")
|
507
|
-
val2 += q_part*posify(q_dict[q_part],tuple(permtrim(u)),tuple(permtrim(v)),perm,var2_t,var3_t,msg,False)
|
511
|
+
if len(perms) == 2:
|
512
|
+
u = tuple(permtrim([*perms[0]]))
|
513
|
+
v = tuple(permtrim([*perms[1]]))
|
514
|
+
if len(perms) == 2 and code(inverse(perms[1])) == medium_theta(inverse(perms[1])) and not mult and not slow and not nilhecke_apply:
|
515
|
+
val2 += q_part*q_dict[q_part]
|
508
516
|
else:
|
509
|
-
|
517
|
+
q_part2 = q_part
|
518
|
+
if not mult and not nilhecke_apply and len(perms) == 2:
|
519
|
+
qv = q_vector(q_part)
|
520
|
+
u2, v2, w2 = u, v, perm
|
521
|
+
u2, v2, w2, qv, did_one = reduce_q_coeff(u2, v2, w2, qv)
|
522
|
+
while did_one:
|
523
|
+
u2, v2, w2, qv, did_one = reduce_q_coeff(u2, v2, w2, qv)
|
524
|
+
q_part2 = np.prod([q_var[i+1]**qv[i] for i in range(len(qv))])
|
525
|
+
if q_part2 == 1:
|
526
|
+
#if q_part != q_part2:
|
527
|
+
# print(f"Posified q part {q_part} {q_dict[q_part]=}")
|
528
|
+
val2 += q_part*posify(q_dict[q_part],u2,v2,w2,var2_t,var3_t,msg,False)
|
529
|
+
else:
|
530
|
+
val2 += q_part*compute_positive_rep(q_dict[q_part],var2_t,var3_t,msg,False)
|
531
|
+
else:
|
532
|
+
val2 += q_part*compute_positive_rep(q_dict[q_part],var2_t,var3_t,msg,False)
|
510
533
|
except Exception as e:
|
511
534
|
if mult:
|
512
535
|
print("warning; --display-positive is on but result is not positive",file=sys.stderr)
|
@@ -515,12 +538,14 @@ def main():
|
|
515
538
|
else:
|
516
539
|
print(f"error; write to schubmult@gmail.com with the case {perms=} {perm=} {val=} {coeff_dict.get(perm,0)=}")
|
517
540
|
print(f"Exception: {e}")
|
541
|
+
import traceback
|
542
|
+
traceback.print_exc()
|
518
543
|
exit(1)
|
519
544
|
if check and expand(val - val2)!=0:
|
520
545
|
if mult:
|
521
546
|
val2 = val
|
522
547
|
else:
|
523
|
-
print(f"error: value not equal; write to schubmult@gmail.com with the case {perms=} {perm=} {
|
548
|
+
print(f"error: value not equal; write to schubmult@gmail.com with the case {perms=} {perm=} {val2=} {coeff_dict.get(perm,0)=}")
|
524
549
|
exit(1)
|
525
550
|
val = val2
|
526
551
|
if expa:
|
@@ -129,7 +129,21 @@ def mult_poly_down(coeff_dict,poly):
|
|
129
129
|
ret[perm] = poly*coeff_dict[perm]
|
130
130
|
return ret
|
131
131
|
|
132
|
-
|
132
|
+
def nilhecke_mult(coeff_dict1,coeff_dict2):
|
133
|
+
ret = {}
|
134
|
+
for w in coeff_dict2:
|
135
|
+
w1 = [*w]
|
136
|
+
inv_w1 = inv(w1)
|
137
|
+
poly = coeff_dict2[w]
|
138
|
+
did_mul = mult_poly_down(coeff_dict1,poly)
|
139
|
+
for v in did_mul:
|
140
|
+
v1 = [*v1]
|
141
|
+
addperm = mulperm(v1,w1)
|
142
|
+
if inv(addperm) == inv(v1) + inv_w1:
|
143
|
+
toadd = tuple(permtrim(addperm))
|
144
|
+
ret[toadd] = ret.get(toadd,0) + did_mul[v]
|
145
|
+
return ret
|
146
|
+
|
133
147
|
def forwardcoeff(u,v,perm,var2=var2,var3=var3):
|
134
148
|
th = theta(v)
|
135
149
|
muv = uncode(th)
|
@@ -1301,55 +1315,55 @@ def posify(val,u2,v2,w2,var2=var2,var3=var3,msg=False,do_pos_neg=True,sign_only=
|
|
1301
1315
|
val2 = schubmult_one(tuple(permtrim(u3)),tuple(permtrim(v3)),var2,var3).get(tuple(permtrim(w3)),0)
|
1302
1316
|
val2 = posify(val2,u3,tuple(permtrim(v3)),w3,var2,var3,msg,do_pos_neg)
|
1303
1317
|
val += tomul*shiftsub(val2)
|
1304
|
-
elif inv(w)-inv(u)==2:
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1352
|
-
|
1318
|
+
#elif inv(w)-inv(u)==2 and len(trimcode(u)) == len(trimcode(w)):
|
1319
|
+
# indices = []
|
1320
|
+
# for i in range(len(w)):
|
1321
|
+
# if i>=len(u) or u[i]!=w[i]:
|
1322
|
+
# indices += [i+1]
|
1323
|
+
# arr = [[[],v]]
|
1324
|
+
# d = -1
|
1325
|
+
# for i in range(len(v)-1):
|
1326
|
+
# if v[i]>v[i+1]:
|
1327
|
+
# d = i + 1
|
1328
|
+
# for i in range(d):
|
1329
|
+
# arr2 = []
|
1330
|
+
#
|
1331
|
+
# if i+1 in indices:
|
1332
|
+
# continue
|
1333
|
+
# i2 = 1
|
1334
|
+
# i2 += len([aa for aa in indices if i+1>aa])
|
1335
|
+
# for vr, v2 in arr:
|
1336
|
+
# dpret = pull_out_var(i2,[*v2])
|
1337
|
+
# for v3r, v3 in dpret:
|
1338
|
+
# arr2 += [[vr + [(v3r,i+1)],v3]]
|
1339
|
+
# arr = arr2
|
1340
|
+
# val = 0
|
1341
|
+
#
|
1342
|
+
# for L in arr:
|
1343
|
+
# v3 = [*L[-1]]
|
1344
|
+
# tomul = 1
|
1345
|
+
# toadd = 1
|
1346
|
+
# for i in range(len(L[0])):
|
1347
|
+
# var_index = L[0][i][1]
|
1348
|
+
# oaf = L[0][i][0]
|
1349
|
+
# if var_index-1>=len(w):
|
1350
|
+
# yv = var_index
|
1351
|
+
# else:
|
1352
|
+
# yv = w[var_index-1]
|
1353
|
+
# for j in range(len(oaf)):
|
1354
|
+
# toadd*= var2[yv] - var3[oaf[j]]
|
1355
|
+
# pooly = skew_div_diff(u,w,schubpoly(v3,[0,*[var2[a] for a in indices]],var3))
|
1356
|
+
# if toadd == 0:
|
1357
|
+
# continue
|
1358
|
+
# if pooly !=0:
|
1359
|
+
# coeff = compute_positive_rep(pooly,var2,var3,msg,False)
|
1360
|
+
# else:
|
1361
|
+
# coeff = 0
|
1362
|
+
# if coeff == -1:
|
1363
|
+
# return -1
|
1364
|
+
# tomul = sympify(coeff)
|
1365
|
+
# toadd*=tomul#.subs(subs_dict3)
|
1366
|
+
# val += toadd
|
1353
1367
|
else:
|
1354
1368
|
if not sign_only:
|
1355
1369
|
if inv(u)+inv(v)-inv(w)==1:
|
@@ -6,7 +6,7 @@ long_description = (this_directory / "README.md").read_text()
|
|
6
6
|
|
7
7
|
setup(
|
8
8
|
name="schubmult",
|
9
|
-
version="1.4.
|
9
|
+
version="1.4.2",
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|