def map_constant(self, expr, type_context): if isinstance(expr, (complex, np.complexfloating)): try: dtype = expr.dtype except AttributeError: # (COMPLEX_GUESS_LOGIC) # This made it through type 'guessing' above, and it # was concluded above (search for COMPLEX_GUESS_LOGIC), # that nothing was lost by using single precision. cast_type = "cfloat" else: if dtype == np.complex128: cast_type = "cdouble" elif dtype == np.complex64: cast_type = "cfloat" else: raise RuntimeError("unsupported complex type in expression " "generation: %s" % type(expr)) return var("%s_new" % cast_type)(expr.real, expr.imag) else: from loopy.symbolic import Literal if type_context == "f": return Literal(repr(float(expr))+"f") elif type_context == "d": return Literal(repr(float(expr))) elif type_context == "i": return int(expr) else: if is_integer(expr): return int(expr) raise RuntimeError("don't know how to generate code " "for constant '%s'" % expr)
def map_constant(self, expr, type_context): if isinstance(expr, (complex, np.complexfloating)): raise NotImplementedError("complex numbers in ispc") else: if type_context == "f": return Literal(repr(float(expr))) elif type_context == "d": # Keepin' the good ideas flowin' since '66. return Literal(repr(float(expr)) + "d") elif type_context == "i": return expr else: from loopy.tools import is_integer if is_integer(expr): return expr raise RuntimeError("don't know how to generate code " "for constant '%s'" % expr)
def map_constant(self, expr, type_context): from loopy.symbolic import Literal if isinstance(expr, (complex, np.complexfloating)): real = self.rec(expr.real) imag = self.rec(expr.imag) iota = p.Variable("I" if "I" not in self.kernel.all_variable_names( ) else "_Complex_I") return real + imag * iota elif np.isnan(expr): return p.Variable("NAN") elif np.isneginf(expr): return -p.Variable("INFINITY") elif np.isinf(expr): return p.Variable("INFINITY") elif isinstance(expr, np.generic): # Explicitly typed: Generated code must reflect type exactly. # FIXME: This assumes a 32-bit architecture. if isinstance(expr, np.float32): return Literal(repr(expr) + "f") elif isinstance(expr, np.float64): return Literal(repr(expr)) # Disabled for now, possibly should be a subtarget. # elif isinstance(expr, np.float128): # return Literal(repr(expr)+"l") elif isinstance(expr, np.integer): suffix = "" iinfo = np.iinfo(expr) if iinfo.min == 0: suffix += "u" if iinfo.max > (2**31 - 1): suffix += "l" return Literal(repr(expr) + suffix) elif isinstance(expr, np.bool_): return Literal("true") if expr else Literal("false") else: raise LoopyError("do not know how to generate code for " "constant of numpy type '%s'" % type(expr).__name__) elif np.isfinite(expr): if type_context == "f": return Literal(repr(np.float32(expr)) + "f") elif type_context == "d": return Literal(repr(float(expr))) elif type_context in ["i", "b"]: return int(expr) else: if is_integer(expr): return int(expr) raise RuntimeError("don't know how to generate code " "for constant '%s'" % expr) else: raise LoopyError("don't know how to generate code " "for constant '%s'" % expr)
def map_constant(self, expr, type_context): from loopy.symbolic import Literal if isinstance(expr, (complex, np.complexfloating)): try: dtype = expr.dtype except AttributeError: # (COMPLEX_GUESS_LOGIC) This made it through type 'guessing' in # type inference, and it was concluded there (search for # COMPLEX_GUESS_LOGIC in loopy.type_inference), that no # accuracy was lost by using single precision. cast_type = "cfloat" else: if dtype == np.complex128: cast_type = "cdouble" elif dtype == np.complex64: cast_type = "cfloat" else: raise RuntimeError( "unsupported complex type in expression " "generation: %s" % type(expr)) return var("%s_new" % cast_type)(expr.real, expr.imag) elif isinstance(expr, np.generic): # Explicitly typed: Generated code must reflect type exactly. # FIXME: This assumes a 32-bit architecture. if isinstance(expr, np.float32): return Literal(repr(expr) + "f") elif isinstance(expr, np.float64): return Literal(repr(expr)) # Disabled for now, possibly should be a subtarget. # elif isinstance(expr, np.float128): # return Literal(repr(expr)+"l") elif isinstance(expr, np.integer): suffix = "" iinfo = np.iinfo(expr) if iinfo.min == 0: suffix += "u" if iinfo.max > (2**31 - 1): suffix += "l" return Literal(repr(expr) + suffix) else: raise LoopyError("do not know how to generate code for " "constant of numpy type '%s'" % type(expr).__name__) else: if type_context == "f": return Literal(repr(np.float32(expr)) + "f") elif type_context == "d": return Literal(repr(float(expr))) elif type_context == "i": return int(expr) else: if is_integer(expr): return int(expr) raise RuntimeError("don't know how to generate code " "for constant '%s'" % expr)