Ask Your Question
1

An algorithm on root systems' vectors "ValueError: too many values to unpack "

asked 4 years ago

SarahDi gravatar image

updated 4 years ago

slelievre gravatar image

While finishing a math project, I need to run the following code, and get an error message which seems related to Sage calculation capacity, could anyone help me through this? (I am quite new to Sage.) If there is no way to handle that in Sage, could anyone recommend me another software with similar language where this code could be run properly?

e = RootSystem(['E', 6]).ambient_space()
Roots = e.roots()
a1 = vector((1/2, -1/2, -1/2, -1/2, -1/2, -1/2, -1/2, 1/2))
a2 = vector((1, 1, 0, 0, 0, 0, 0, 0))
a3 = vector((-1, 1, 0, 0, 0, 0, 0, 0))  
a4 = vector((0, -1, 1, 0, 0, 0, 0, 0))
a5 = vector((0, 0, -1, 1, 0, 0, 0, 0)) 
a6 = vector((0, 0, 0, -1, 1, 0, 0, 0))
Lini = [a1, a2, a3, a4, a5]

def proj(t, ai):
    myLone = vector(ai)
    result= t - myLone.dot_product(t) / (ai.dot_product(ai))*myLone
    return result

myP = [proj(x, a6) for x in Lini]
[proja1, proja2, proja3, proja4, proja5] = myP
myR = [vector(v) for v in Roots]
myL = [proj(x, a6) for x in myR]

len(myL)

myPlist1= Combinations(myP, 3).list()
myLlist1= Combinations(myL, 2).list()

# alternatively: produce all combinaisons in myL of five vectors
# (all to be used in a function where these combinaisons are variables:
# this does not work either

# myLlist = Combinations(myL, 5).list()

def letsapply(listg, alist):
    for listel in listg:
        myPset1= set(tuple(v) for v in listel)
        print(myPset1)
    for listel2 in alist:
        myLset1 = set(tuple(v) for v in listel2)
        print(myLset1)
        myLset1 = myLset1.union(myPset1)

        if len(myLset1) >= 5:
            print(myLset1, "myLset1")

        if len(myLset1) >= 5:
            for myLel in myLset1:
                [proja1, proja2, proja3, proja4, proja5] = myLel
                print(myLel)

print(letsapply(myPlist1, myLlist1))
Preview: (hide)

Comments

1

Beware about the indentation. If you need nested loops, you should indent the inner loop more than the outer loop.

FrédéricC gravatar imageFrédéricC ( 4 years ago )

1 Answer

Sort by » oldest newest most voted
1

answered 4 years ago

tmonteil gravatar image

As i can see, the elements of myLset1 are vectors of length 8, so when you loop for myLel in myLset1:, each myLel is a vector of length 8, so you can not write [proja1, proja2, proja3, proja4, proja5] = myLel.

If you want to pick the 5 first coordinates of myLel, you can use a slice: [proja1, proja2, proja3, proja4, proja5] = myLel[:5]

That said, note that proja1, proja2, ... are not used elsewhere in the function.

Preview: (hide)
link

Comments

1

Yes, my bad, I wanted :

if len(myLset1) >= 5: [proja1, proja2, proja3, proja4, proja5] = myLset1 Thanks!

SarahDi gravatar imageSarahDi ( 4 years ago )

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

Stats

Asked: 4 years ago

Seen: 372 times

Last updated: Sep 24 '20