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.
Files changed (31) hide show
  1. {schubmult-1.4.0 → schubmult-1.4.2}/PKG-INFO +1 -1
  2. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/perm_lib.py +91 -1
  3. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_yz/schubmult_q_yz.py +42 -17
  4. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_yz/schubmult_yz.py +64 -50
  5. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/PKG-INFO +1 -1
  6. {schubmult-1.4.0 → schubmult-1.4.2}/setup.py +1 -1
  7. {schubmult-1.4.0 → schubmult-1.4.2}/LICENSE +0 -0
  8. {schubmult-1.4.0 → schubmult-1.4.2}/README.md +0 -0
  9. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/__init__.py +0 -0
  10. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_double/__init__.py +0 -0
  11. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_double/__main__.py +0 -0
  12. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_double/schubmult_double.py +0 -0
  13. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_py/__init__.py +0 -0
  14. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_py/__main__.py +0 -0
  15. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_py/schubmult_py.py +0 -0
  16. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q/__init__.py +0 -0
  17. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q/__main__.py +0 -0
  18. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q/schubmult_q.py +0 -0
  19. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_double/__init__.py +0 -0
  20. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_double/__main__.py +0 -0
  21. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_double/schubmult_q_double.py +0 -0
  22. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_yz/__init__.py +0 -0
  23. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_q_yz/__main__.py +0 -0
  24. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_yz/__init__.py +0 -0
  25. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult/schubmult_yz/__main__.py +0 -0
  26. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/SOURCES.txt +0 -0
  27. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/dependency_links.txt +0 -0
  28. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/entry_points.txt +0 -0
  29. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/requires.txt +0 -0
  30. {schubmult-1.4.0 → schubmult-1.4.2}/schubmult.egg-info/top_level.txt +0 -0
  31. {schubmult-1.4.0 → schubmult-1.4.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: schubmult
3
- Version: 1.4.0
3
+ Version: 1.4.2
4
4
  Summary: Computing Littlewood-Richardson coefficients of Schubert polynomials
5
5
  Home-page: https://github.com/matthematics/schubmult
6
6
  Author: Matt Samuel
@@ -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[i] == orig_perm[i]]
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 and q_part == 1 and not mult:
495
- u = permtrim([*perms[0]])
496
- v = permtrim([*perms[1]])
497
- val2 += posify(q_dict[q_part],tuple(u),tuple(v),perm,var2_t,var3_t,msg,False)
498
- elif len(perms) == 2 and q_part in q_var2 and not mult:
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
- val2 += q_part*compute_positive_rep(q_dict[q_part],var2_t,var3_t,msg,False)
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=} {val=} {coeff_dict.get(perm,0)=}")
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
- indices = []
1306
- for i in range(len(w)):
1307
- if i>=len(u) or u[i]!=w[i]:
1308
- indices += [i+1]
1309
- arr = [[[],v]]
1310
- d = -1
1311
- for i in range(len(v)-1):
1312
- if v[i]>v[i+1]:
1313
- d = i + 1
1314
- for i in range(d):
1315
- arr2 = []
1316
-
1317
- if i+1 in indices:
1318
- continue
1319
- i2 = 1
1320
- i2 += len([aa for aa in indices if i+1>aa])
1321
- for vr, v2 in arr:
1322
- dpret = pull_out_var(i2,[*v2])
1323
- for v3r, v3 in dpret:
1324
- arr2 += [[vr + [(v3r,i+1)],v3]]
1325
- arr = arr2
1326
- val = 0
1327
-
1328
- for L in arr:
1329
- v3 = [*L[-1]]
1330
- tomul = 1
1331
- toadd = 1
1332
- for i in range(len(L[0])):
1333
- var_index = L[0][i][1]
1334
- oaf = L[0][i][0]
1335
- if var_index-1>=len(w):
1336
- yv = var_index
1337
- else:
1338
- yv = w[var_index-1]
1339
- for j in range(len(oaf)):
1340
- toadd*= var2[yv] - var3[oaf[j]]
1341
- pooly = skew_div_diff(u,w,schubpoly(v3,[0,*[var2[a] for a in indices]],var3))
1342
- if toadd == 0:
1343
- continue
1344
- if pooly !=0:
1345
- coeff = compute_positive_rep(pooly,var2,var3,msg,False)
1346
- else:
1347
- coeff = 0
1348
- if coeff == -1:
1349
- return -1
1350
- tomul = sympify(coeff)
1351
- toadd*=tomul#.subs(subs_dict3)
1352
- val += toadd
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: schubmult
3
- Version: 1.4.0
3
+ Version: 1.4.2
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.4.0",
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