2016-04-30 2 views
0

Я работаю над созданием адаптивного отклоняющего пробоотборника в Numba. Я хотел бы использовать класс для его реализации, так как я думаю, что он сделает код более чистым, и я вижу, что классы поддерживаются в Numba. Мой класс был бы намного более общим/полезным, если бы он мог принимать функции как входные данные, т. Е. Журнал pdf дистрибутива, который я хочу отбирать. Есть ли способ сделать это? Альтернативой, я полагаю, является определение уравнений журнала pdf в самом определении класса.Numba jitclass с функциональным вводом

Почему я хочу это сделать? Сэмплер будет использоваться как часть схемы выборки Гиббса, поэтому ускорение на каждом этапе выборки имеет решающее значение. Я должен симулировать из дистрибутива, который я знаю только до нормализующей константы, а адаптивная отбраковка - это общий метод, который поможет мне опробовать без необходимости знать эту нормализующую константу. Существует реализация python адаптивного отклоняющего сэмплера, плавающего вокруг переполнения стека, но это слишком медленно для моих целей. Он также случайно разбивается по некоторым причинам на некоторые смоделированные данные, над которыми он должен работать. Мне повезло с numba в других частях моего проекта, включая более 100-кратное ускорение на одной части пробоотборника Gibbs.

ответ

1

Функции Numba не могут принимать функции в качестве входных аргументов. Официальные документы рекомендуется, возможно, с помощью замыкания в функции завода в качестве обходного пути в некоторых случаях:

http://numba.pydata.org/numba-doc/latest/user/faq.html#can-i-pass-a-function-as-an-argument-to-a-jitted-function

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

def make_f(g): 
    # Note: a new f() is compiled each time make_f() is called! 
    @jit(nopython=True) 
    def f(x): 
     return g(x) + g(-x) 
    return f 

f = make_f(my_g_function) 
result = f(1) 

Не уверен, что это будет работать в вашем конкретном случае. Я думаю, что определение функций, которые вы хотите использовать в качестве методов класса, будет лучшей стратегией, хотя без примера кода я просто догадываюсь.

Смежные вопросы