2010-11-28 4 views
5

Cython을 사용하여 코드의 속도를 높이려고합니다. Cython에서 람다 함수를 사용할 때 "식별자 또는 리터럴이 필요합니다"라는 오류가 발생합니다. 내가 알 수있는 한, 람다 함수는 Cython 0.13에서 지원 될 예정입니다. 이 시점에서 잘못 되었습니까? 그들이 실제로 지원된다면, 내가 여기 구현 한 것 이외의 것을해야합니까? 당신이 다른 곳 inf을 정의하지 않는 제 생각에는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

정확히 어떤 줄로 오류가 발생합니까? – Gabe

+0

나는 당신이 '나는 = lambda e1, e2 : f (e1, e2, rho)'라고 생각한다고 생각한다. – razpeitia

+0

미안. h_z의 정의가 오류를 그립니다. –

답변

1

당신은 h_z = lambda e_1: -float('inf')h_z = lambda e_1: -inf을 변경해야합니다.

0

아래의 간단한 Cython 코드를 컴파일하고 OS X 10.6.6의 Cython 0.14.1을 사용하여 잘 실행할 수 있습니다. 왜 0.13에서 작동하지 않는지에 대한 자세한 내용을 알지 못합니다. 가장 쉬운 해결책은 가능한 경우 Cython을 업그레이드하는 것입니다.

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" 
관련 문제