"""
Contains the function push_down, which is used by intersection7.py.

Not sure if there is a good reason for this to be in its own file.
"""

try:
    from TautRing3 import *
    from sage.all import *
except ImportError:
    pass
    
def push_down(psi_exp, g,n):
    """
    Pushes down the psi_classes via forgetful maps as far as possible, using the string equation and the formula from [AC].  Returns a polynomial in psi and kappa classes.
    """
    #print "recieved",psi_exp,g,n
    psi_exp = [expon for expon in psi_exp if expon != 0]
    if len(psi_exp) == n:
        #use AC formula
        if g == 0:
            raise Exception, "???"
        elif g == 1:
            raise Exception, "???"
        else:
            M = Mgn(g,0)
        result = 0
        for p in SetPartitions(range(len(psi_exp))):            
            result += prod([factorial(len(s) - 1) for s in p])*prod([kappa_class(M,sum([psi_exp[i]-1 for i in s])) for s in p])
        return result
    else:
        #do string equation
        value = 0
        for i in range(len(psi_exp)):
            a = list(psi_exp)
            a[i] -= 1
            value += push_down(a, g,n-1)
        return value
        
        
        

    
    
    
