Exemple #1
0
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)
Exemple #2
0
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)