6

Cython を使用してコードを高速化しようとしています。ラムダ関数を使用すると、Cython で「識別子またはリテラルが必要です」というエラーが表示されます。私が知る限り、ラムダ関数は Cython 0.13 でサポートされる予定です。この点で私は間違っていますか?それらが実際にサポートされている場合、それらを実装するためにここにあるもの以外に何かする必要がありますか?

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]
4

2 に答える 2

2

私の意見では、他の場所で定義していない限り、変更h_z = lambda e_1: -infする必要があります。h_z = lambda e_1: -float('inf')inf

于 2010-11-28T07:35:43.097 に答える
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"
于 2011-02-19T19:43:47.100 に答える