def _Op(self, term): spine = term.spine args = term.args # visit the innermost arguments, push those arguments on # the instruction list first self.visit(term.args) fn, cost = lookup(term) fargs = [self._vartable[a] for a in args] # push the temporary for the result in the vartable key = self.var(term) # build the instruction & push it on the stack inst = Instruction(str(fn.fn), fargs, lhs=key) self._instructions.append(inst)
def _Arithmetic(self, term): # All the function signatures are of the form # # Add(a,b) # # But the aterm expression for LLVM is expected to be # # Arithmetic(Add, ...) # # so we do this ugly hack to get the signature back to # standard form # -- hack -- op = term.args[0] args = term.args[1:] normal_term = AAppl(ATerm(op), args) # -- assert isinstance(op, ATerm) label = op.label # Find us implementation for execution # Returns either a ExternalF ( reference to a external C # library ) or a PythonF, a Python callable. These can be # anything, numpy ufuncs, numexpr, pandas, cmath whatever from blaze.rts.funcs import lookup # visit the innermost arguments, push those arguments on # the instruction list first self.visit(args) fn, cost = lookup(normal_term) fargs = [self._vartable[a] for a in args] # push the temporary for the result in the vartable key = self.var(term) # build the instruction & push it on the stack inst = Instruction(str(fn.fn), get_datashape(term), fargs, lhs=key) self._instructions.append(inst)
def test_match1(): expr = AAppl(ATerm('Add'), [AInt(1), AInt(2)]) fn, cost = lookup(expr) assert fn.fn == add.fn.im_func
def test_match2(): expr = AAppl(ATerm('Mul'), [ATerm('Array'), ATerm('Array')]) fn, cost = lookup(expr) assert fn.fn == multiply.fn.im_func
def test_match1(): expr = parse('Add(1,2)') fn, cost = lookup(expr)
def test_match2(): expr = parse('Mul(1,2)') fn, cost = lookup(expr)