2017-08-24 4 views
1

J'essaye de compiler une fonction en python en utilisant le mode "nopython". La fonction compile lorsque je ne fournis pas d'informations de type en utilisant simplement le décorateur @numba.njit.Erreur de frappe lors de la compilation de njit lors de la fourniture de types explicites avec numba

Voici la définition de fonction avec le décorateur appliquée et en saisissant les informations inclus:

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 

Quand je lance ce morceau de code sans appeler la fonction que je reçois l'erreur suivante:

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) 

Le La ligne de la fonction à laquelle ce message d'erreur fait référence inclut: return 3.2181*flow - 11.344. Lorsque j'ai débogué cette fonction, j'ai remarqué que la valeur de flow à cette ligne est None. Quelqu'un peut-il me dire ce que je fais mal ici et comment les informations de typage peuvent être incluses?

Répondre

2

Chaque fonction Python renvoie implicitement None si aucun return final n'est donné. C'est pourquoi il est dit No conversion from none to float64. Numba et Python ne peuvent pas être certains que vous passerez toujours dans un head qui correspond à l'une de vos branches, puis il retournera None. Mais avec la signature que vous avez spécifié qu'il peut seulement retourner float64 s!

Dans votre cas (si ce n'était pas un oubli) Il suffit d'inclure un return 0. après toutes les branches if et elif:

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