def _eval_operand(op, args, env): if is_constants(args): pyfunc = _typerules.get_pyfunc(type(op)) return Constant(pyfunc(*[x.obj for x in args])) ufunc = _typerules.get_ufunc(env.mode, type(op)) return _call_ufunc(ufunc, args, None, env)
def _eval_operand(op, args, env, dtype=None): ufunc = _typerules.get_ufunc(env.mode, type(op)) assert ufunc.nin == len(args) assert ufunc.nout == 1 for x in args: if not isinstance(x.ctype, _types.Scalar): raise NotImplementedError in_types = tuple([x.ctype.dtype for x in args]) if dtype is None: op = ufunc._ops._guess_routine_from_in_types(in_types) else: op = ufunc._ops._guess_routine_from_dtype(dtype) if op is None: raise TypeError( f'"{ufunc.name}" does not support for the input types: {in_types}') if op.routine is None: op.error_func() assert op.routine.startswith('out0 = ') out_type = _types.Scalar(op.out_types[0]) expr = op.routine[7:] for i, x in enumerate(args): x = astype_scalar(x, _types.Scalar(op.in_types[i])) expr = expr.replace(f'in{i}', x.code) expr = expr.replace('out0_type', str(out_type)) env.preambles.add(ufunc._preamble) return CudaObject('(' + expr + ')', out_type)