import sys, os; sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from e6core import *
from fractions import Fraction as Fr
import itertools, math
# inverse Cartan (coweight -> coroot coords)
M = [[Fr(A[i][j]) for j in range(n)] + [Fr(int(i == j)) for j in range(n)] for i in range(n)]
for c in range(n):
    p = [r for r in range(c, n) if M[r][c] != 0][0]; M[c], M[p] = M[p], M[c]
    pv = M[c][c]; M[c] = [x/pv for x in M[c]]
    for r in range(n):
        if r != c and M[r][c] != 0:
            f = M[r][c]; M[r] = [x - f*y for x, y in zip(M[r], M[c])]
Ainv = [[M[i][n+j] for j in range(n)] for i in range(n)]
def coweight(a, b):  # a w1^vee + b w6^vee in coroot coords
    return [Ainv[i][0]*a + Ainv[i][5]*b for i in range(n)]
out = {}
for a in range(0, 19):
    for b in range(0, 19):
        if (a - b) % 3: continue
        half = [x/2 for x in coweight(a, b)]           # kappa/2, rational, black part zero
        c1 = (2*a + b)//3; c6 = (a + 2*b)//3
        base = [math.floor(half[j]) for j in black]
        best = None
        for x in itertools.product(range(-2, 4), repeat=4):
            mu = (c1, base[0]+x[0], base[1]+x[1], base[2]+x[2], base[3]+x[3], c6)
            assert ab(mu) == (a, b)
            m = min(ip(beta, mu) for beta in PosU)
            if best is None or m > best[0]: best = (m, mu)
        out[(a, b)] = best
bad = sorted(k for k, v in out.items() if v[0] < 0)
print('bad labels (a,b<=18):', bad)
print('values:', {k: out[k][0] for k in bad})
print('(3,0) best rep:', out[(3,0)], ' (9,0):', out[(9,0)], ' (6,0):', out[(6,0)])
