2015-07-30 3 views
0

Я пытаюсь скомпилировать проект cyrand с использованием cython, но при запуске перегруженных конструкторов я запускаю причудливую ошибку компиляции. См. Это gist для файлов, о которых идет речь.Cython не распознает перегруженный конструктор

С сутью, я могу скомпилировать и запустить example.pyx просто отлично, который использует конструктор по умолчанию:

import numpy as np 
cimport numpy as np 

cimport cython 

include "random.pyx" 

@cython.boundscheck(False) 
def example(n): 

    cdef int N = n 

    cdef rng r 
    cdef rng_sampler[double] * rng_p = new rng_sampler[double](r) 
    cdef rng_sampler[double] rng = deref(rng_p) 

    cdef np.ndarray[np.double_t, ndim=1] result = np.empty(N, dtype=np.double) 

    for i in range(N): 
     result[i] = rng.normal(0.0, 2.0) 
    print result 
    return result 

^это работает и работает хорошо. Пример запуска производит следующий вывод:

$ python test_example.py [ 0.47237842 3.153744849 3.6854932057 ]

Но когда я пытаюсь скомпилировать и запустить тест, который используется конструктор, который принимает беззнаковое долго в качестве аргумента:

import numpy as np 
cimport numpy as np 

cimport cython 

include "random.pyx" 

@cython.boundscheck(False) 
def example_seed(n, seed): 

    cdef int N = n 
    cdef unsigned long Seed = seed 

    cdef rng r 
    cdef rng_sampler[double] * rng_p = new rng_sampler[double](Seed) 
    cdef rng_sampler[double] rng = deref(rng_p) 

    cdef np.ndarray[np.double_t, ndim=1] result = np.empty(N, dtype=np.double) 

    for i in range(N): 
     result[i] = rng.normal(0.0, 2.0) 
    print result 
    return result 

я получаю следующее Cython ошибка компилятора:

Error compiling Cython file: 
    ----------------------------------------------------------- 
    ...  
     cdef int N = n  
     cdef unsigned long Seed = seed 

     cdef rng_sampler[double] * rng_p = new rng_sampler[double](Seed) 
    ---------------------------------------------------------- 
    example/example_seed.pyx:15:67 Cannot assign type 'unsigned long' to 'mt19937' 

Я расцениваю это сообщение, наряду с тем, что example.pyx компилирует и производит рабочий example.so, этот cython не может найти (или управлять) конструктор rng_sampler, который принимает unsigned long как вход. Раньше я не использовал cython, и мой cpp в лучшем случае средний. Может ли кто-нибудь пролить свет на то, как исправить эту простую проблему?

питон: 2.7.10 (Anaconda 2.0.1) Cython: 0.22.1

+0

Он, похоже, работает с Cython 0.21.1 (я только делал компиляцию с Cython, но не компиляцию с C++). Я подозреваю, что это ошибка, появившаяся в Cython 0.22.1, и, возможно, стоит сообщить об этом. – DavidW

+0

@ DavidW: не могли бы вы разместить другие соответствующие настройки среды? После понижения до Cython 0.21.1 все еще встречаются те же ошибки. – LeeZamparo

+0

@ DavidW: Спасибо за точку данных. После понижения до 0.21.1 я получил тот же результат. Затем я попробовал на другой машине, это сработало. Я попробовал обновить до 0,22.1, это сработало. Затем на оригинальной машине я установил другую версию boost, и она сработала. Таким образом, это оказалось проблемой с тем, как я установил boost:/ – LeeZamparo

ответ

0

Я решил исправить эту ошибку, это было с тем, как установлено повышение. Я установил boost через apt-get. После загрузки/разворота и изменения указателей для увеличения в setup.py, он работает.