2010-11-28 41 views
5

J'essaie d'utiliser Cython pour accélérer un morceau de code. Cython donne une erreur qui lit "Expected an identifier ou literal" quand j'utilise les fonctions lambda. Autant que je sache, les fonctions lambda sont censées être supportées par Cython 0.13. Suis-je incorrect sur ce point? S'ils sont, en effet, soutenus, dois-je faire autre chose que ce que j'ai ici pour les mettre en œuvre?Erreur lors de l'utilisation de la fonction lambda avec Cython

def f(e_1, e_2, rho): 
    """Bivariate Normal pdf with mean zero, unit variances, and correlation coefficient rho.""" 
    return (1.0/(2.0 * pi * sqrt(1 - rho**2))) * exp(-(1.0/(2*(1 - rho**2))) * (e_1**2 + e_2**2 - 2*rho*e_1*e_2)) 

def P_zero(b_10, b_11, b_20, b_21, rho, gamma, x): 
    """Returns the probability of observing zero entrants in a market by numerically 
    integrating out the unobserved firm-specific profit shocks.""" 
    h_z = lambda e_1: -inf 
    g_z = lambda e_1: -b_10 - b_11*x[0] - gamma*x[1] 
    I = lambda e_1, e_2: f(e_1, e_2, rho) 
    return dblquad(I, -inf, (-b_20 - b_21*x[0] - gamma*x[2]), h_z, g_z)[0] 
+0

Exactement quelle ligne vous donne l'erreur? – Gabe

+0

Je pense que vous voulez dire 'I = lambda e1, e2: f (e1, e2, rho)' – razpeitia

+0

Droit, désolé. La définition de h_z dessine l'erreur. –

Répondre

1

À mon avis, vous devriez changer h_z = lambda e_1: -inf avec h_z = lambda e_1: -float('inf') à moins que vous avez défini inf ailleurs.

0

Je suis capable de compiler le code Cython simplifié ci-dessous et de l'exécuter correctement en utilisant Cython 0.14.1 sous OS X 10.6.6. Je ne connais pas les détails pour savoir pourquoi ça ne marche pas sur 0.13. La solution la plus simple consiste à mettre à niveau Cython, si possible.

def f(e_1, e_2, rho): 
    return e_1 + e_2 + rho 

def dummy(a, b, c, d, e): 
    return [a(1,2) + b + c + d(1) + e(3)] 

def P_zero(b_10, b_11, b_20, b_21, rho, gamma, x): 
    h_z = lambda e_1: -1000 
    g_z = lambda e_1: -b_10 - b_11 * x[0] - gamma * x[1] 
    I = lambda e_1, e_2: f(e_1, e_2, rho) 
    return dummy(I, -1000, (-b_20 - b_21 * x[0] - gamma * x[2]), h_z, g_z)[0] 

print P_zero(1, 2, 3, 4, 5, 6, [6, 7, 8]) 
# outputs "-2122"