Ошибка ввода во время компиляции njit при предоставлении явных типов с помощью numba

Я пытаюсь скомпилировать функцию в python, используя режим «nopython». Функция компилируется, когда я не предоставляю информацию о типе, просто используя декоратор @numba.njit.

Вот определение функции с примененным декоратором и включенной информацией о вводе:

from numba import njit, float64, int64

@njit(float64(float64, int64))
def PowerCurve(flow, head):
    if head==326:
        if flow<(10.788/3.03):  #speed no load approximation
            return 0
        else:
            return 3.03*flow - 10.788   #approximating power for each gross head using equation to avoid interpolation
    elif head==328:
        if flow<(10.939/3.0525):
            return 0
        else:
            return 3.0525*flow - 10.969
    elif head==330:
        if flow<(10.982/3.0683):
            return 0
        else:
            return 3.0683*flow - 10.982
    elif head==332:
        if flow<(11.006/3.0842):
            return 0
        else:
            return 3.0842*flow - 11.006
    elif head==334:
        if flow<(11.025/3.1001):
            return 0
        else:
            return 3.1001*flow - 11.025
    elif head==336:
        if flow<(11.043/3.116):
            return 0
        else:
            return 3.116*flow - 11.043
    elif head==338:
        if flow<(11.063/3.1317):
            return 0
        else:
            return 3.1317*flow - 11.063
    elif head==340:
        if flow<(11.086/3.1477):
            return 0
        else:
            return 3.1477*flow - 11.086
    elif head==342:
        if flow<(11.103/3.1636):
            return 0
        else:
            return 3.1636*flow - 11.103
    elif head==344:
        if flow<(11.135/3.1798):
            return 0
        else:
            return 3.1798*flow - 11.135
    elif head==346:
        if flow<(11.315/3.2021):
            return 0
        else:
            return 3.2021*flow - 11.315
    elif head==348:
        if flow<(11.344/3.2181):
            return 0
        else:
            return 3.2181*flow - 11.344

Когда я запускаю этот фрагмент кода без вызова функции, я получаю следующую ошибку:

 Traceback (most recent call last):
  File "Optimize.py", line 516, in <module>
    @njit(float64(float64, int64))
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\decorators.py", line 199, in wrapper
    disp.compile(sig)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\dispatcher.py", line 579, in compile
    cres = self._compiler.compile(args, return_type)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\dispatcher.py", line 80, in compile
    flags=flags, locals=self.locals)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\compiler.py", line 740, in compile_extra
    return pipeline.compile_extra(func)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\compiler.py", line 360, in compile_extra
    return self._compile_bytecode()
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\compiler.py", line 699, in _compile_bytecode
    return self._compile_core()
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\compiler.py", line 686, in _compile_core
    res = pm.run(self.status)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\compiler.py", line 246, in run
    raise patched_exception
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\compiler.py", line 238, in run
    stage()
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\compiler.py", line 452, in stage_nopython_frontend
    self.locals)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\compiler.py", line 841, in type_inference_stage
    infer.propagate()
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\typeinfer.py", line 773, in propagate
    raise errors[0]
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\typeinfer.py", line 129, in propagate
    constraint(typeinfer)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\typeinfer.py", line 154, in __call__
    typeinfer.copy_type(self.src, self.dst, loc=self.loc)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\typeinfer.py", line 791, in copy_type
    unified = self.typevars[dest_var].union(self.typevars[src_var], loc=loc)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\typeinfer.py", line 83, in union
    self.add_type(other.type, loc=loc)
  File "C:\Users\patri\Miniconda3\lib\site-packages\numba\typeinfer.py", line 47, in add_type
    loc=loc)
numba.errors.TypingError: Failed at nopython (nopython frontend)
No conversion from none to float64 for '$442.2', defined at None
File "Optimize.py", line 577
[1] During: typing of assignment at Optimize.py (577)

Строка функции, на которую ссылается это сообщение об ошибке, включает следующее: return 3.2181*flow - 11.344. Когда я отлаживал эту функцию, я заметил, что значение flow в этой строке равно None. Может ли кто-нибудь сказать мне, что я делаю неправильно здесь и как можно включить информацию о вводе?


person pbreach    schedule 24.08.2017    source источник


Ответы (1)


Каждая функция Python неявно возвращает None, если не указано окончательное return. Вот почему он говорит No conversion from none to float64. Numba и Python не могут быть уверены, что вы всегда будете передавать head, совпадающий с любой из ваших ветвей, и тогда он вернет None. Но с указанной вами подписью он может возвращать только float64s!

В вашем случае (если это не было упущением) просто добавьте return 0. после всех ветвей if и elif:

...
elif head==348:
    if flow<(11.344/3.2181):
        return 0
    else:
        return 3.2181*flow - 11.344
return 0
person MSeifert    schedule 24.08.2017