0

Following up from here, Numba is finally working (after weeks) on my machine, without any weird indentation errors.

I've implemented it as in the solution to the linked question.

However, I now get this string of errors from Numba, the last line being that it can't coerce to or from object in nopython context:

Traceback (most recent call last):
  File "C:\Users\app\Documents\Python Scripts\gbc_classifier_train.py", line 19, in <module>
    import gentleboost_c_class_jit_v6_nolimit as gbc
  File "C:\Users\app\Documents\Python Scripts\gentleboost_c_class_jit_v6_nolimit.py", line 26, in <module>
    @jit(void(object_, float_[:,:], int_[:], int_))
  File "C:\Users\app\Anaconda\lib\site-packages\numba\decorators.py", line 224, in _jit_decorator
    nopython=nopython, func_ast=func_ast, **kwargs)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\decorators.py", line 133, in compile_function
    func_env = pipeline.compile2(env, func, restype, argtypes, func_ast=func_ast, **kwds)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 144, in compile2
    post_ast = pipeline(func_ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 191, in __call__
    ast = self.transform(ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 656, in transform
    ast = stage(ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 641, in _stage
    return _check_stage_object(stage_obj)(ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 194, in __call__
    ast = self.transform(ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 474, in transform
    return transformer.visit(ast)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 311, in visit_ControlBlock
    self.visitlist(node.body)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 286, in visitlist
    list[:] = _flatmap(self.visit, list)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 33, in _flatmap
    res = func(elem)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 306, in generic_visit
    new_node = self.visit(old_value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 311, in visit_ControlBlock
    self.visitlist(node.body)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 286, in visitlist
    list[:] = _flatmap(self.visit, list)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 33, in _flatmap
    res = func(elem)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 306, in generic_visit
    new_node = self.visit(old_value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 311, in visit_ControlBlock
    self.visitlist(node.body)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 286, in visitlist
    list[:] = _flatmap(self.visit, list)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\visitors.py", line 33, in _flatmap
    res = func(elem)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 306, in generic_visit
    new_node = self.visit(old_value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 297, in generic_visit
    value = self.visit(value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\array_expressions.py", line 100, in visit_Assign
    node.value = self.visit(node.value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\ast.py", line 306, in generic_visit
    new_node = self.visit(old_value)
  File "C:\Users\app\Anaconda\lib\ast.py", line 241, in visit
    return visitor(node)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\array_expressions.py", line 136, in visit_BinOp
    return self.visit_elementwise(elementwise, node)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\array_expressions.py", line 84, in visit_elementwise
    return self.register_array_expression(node)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\array_expressions.py", line 272, in register_array_expression
    wrap=False, link=False, nopython=True,
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 90, in run_pipeline2
    post_ast = pipeline(func_ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 191, in __call__
    ast = self.transform(ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 656, in transform
    ast = stage(ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 641, in _stage
    return _check_stage_object(stage_obj)(ast, env)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\pipeline.py", line 202, in __call__
    reporting.report(env, exc=e)
  File "C:\Users\app\Anaconda\lib\site-packages\numba\reporting.py", line 181, in report
    raise exc
numba.error.NumbaError: (see below)
--------------------- Numba Encountered Errors or Warnings ---------------------
Error 133:22: Cannot coerce to or from object in nopython context
--------------------------------------------------------------------------------

What does this mean? I hope it doesn't mean I can't use objects!

Edit

I've edited all relevant code so that I'm no longer passing any objects around, and the definition now looks like this:

@jit(float_[:,:,:](float_[:,:], int_[:], int_))
def train_function(X, y, H):

But I'm still getting that error, except now it's not Error:133:22, but:

Error 176:22: Cannot coerce to or from object in nopython context
Community
  • 1
  • 1
user961627
  • 12,379
  • 42
  • 136
  • 210
  • I don't know if this is a problem with the `instance` argument, it could be. Can you factor out what the `train_function` function would take *from* `instance` and pass those in as separate arguments instead? – Martijn Pieters Sep 05 '14 at 13:01
  • I can - but the function would then also have to return one 2D array and one 3D array (which are actually the class members that it's supposed to modify). I'll try that now! – user961627 Sep 05 '14 at 13:17
  • what would the syntax be for @jit definition be? I tried this: `@jit(float_[:,:], float_[:,:,:](object_, float_[:,:], int_[:], int_))` But got an error on this line saying: `assert isinstance(item, (tuple, slice)), item AssertionError: 0` – user961627 Sep 05 '14 at 13:33
  • Also, I guess I don't keep the `object_` parameter in the `@jit` definition now. – user961627 Sep 05 '14 at 13:37
  • http://stackoverflow.com/questions/25687445/assertion-error-after-passing-arrays-to-and-from-function-while-trying-jit – user961627 Sep 05 '14 at 13:49
  • I don't know how to specify a tuple return, sorry. – Martijn Pieters Sep 05 '14 at 13:59
  • So is that the only issue? I can actually deal with not sending a tuple. I can also get my work done by only returning the 3D array (and not the 2D array). So I just tried that... I returned only g_per_round (which is the 3D array), and wrote the definition as: `@jit(float_[:,:,:](object_, float_[:,:], int_[:], int_))` But I now get this: `TypeError: Arrays must have consistent types in assignment for variable 'g': 'float64[:, :]' and 'none'` – user961627 Sep 05 '14 at 14:05
  • Alright so after removing the whole object and fixing this TypeError above, now I'm back to square one :( `Error 176:22: Cannot coerce to or from object in nopython context`. What does it even mean? What's "nopython context"? Edited the question. – user961627 Sep 05 '14 at 14:59
  • Solved this issue - the problem was the dot products. – user961627 Sep 05 '14 at 15:27
  • 1
    Glad you solved it; sorry I wasn't more help there, I don't use Numba myself. At a guess, *nopython* means the compiled part vs. the pure python parts. – Martijn Pieters Sep 05 '14 at 15:34
  • Not completed fixed though! The code took longer to crash than usual, but crashed nonetheless, this time saying: `NotImplementedError: Unable to cast from double to { i64, i8* }*`. – user961627 Sep 05 '14 at 15:38

1 Answers1

2

I found out somewhere that Numba doesn't recognize np.dot() directly, and the Error: 176:22 was pointing to line 176, where I was using np.dot(). This was the relevant line:

 dot = 1. + np.dot(X1, g1) - np.dot(X1,gc)

So I cast the dot products it into floats, and it worked:

dot = 1. + float(np.dot(X1, g1)) - float(np.dot(X1,gc))
user961627
  • 12,379
  • 42
  • 136
  • 210