def map_product(self, expr, enclosing_prec): tgt_dtype = self.infer_type(expr) is_complex = 'c' == tgt_dtype.kind if not is_complex: return CCodeMapperBase.map_product(self, expr, enclosing_prec) else: tgt_name = self.complex_type_name(tgt_dtype) reals = [child for child in expr.children if 'c' != self.infer_type(child).kind] complexes = [child for child in expr.children if 'c' == self.infer_type(child).kind] from pymbolic.mapper.stringifier import PREC_PRODUCT, PREC_NONE real_prd = self.join_rec("*", reals, PREC_PRODUCT) if len(complexes) == 1: myprec = PREC_PRODUCT else: myprec = PREC_NONE complex_prd = self.rec(complexes[0], myprec) for child in complexes[1:]: complex_prd = "%s_mul(%s, %s)" % ( tgt_name, complex_prd, self.rec(child, PREC_NONE)) if real_prd: # elementwise semantics are correct result = "%s * %s" % (real_prd, complex_prd) else: result = complex_prd return self.parenthesize_if_needed(result, enclosing_prec, PREC_PRODUCT)
def map_product(self, expr, enclosing_prec): tgt_dtype = self.infer_type(expr) is_complex = 'c' == tgt_dtype.kind if not is_complex: return CCodeMapperBase.map_product(self, expr, enclosing_prec) else: tgt_name = self.complex_type_name(tgt_dtype) reals = [ child for child in expr.children if 'c' != self.infer_type(child).kind ] complexes = [ child for child in expr.children if 'c' == self.infer_type(child).kind ] from pymbolic.mapper.stringifier import PREC_PRODUCT, PREC_NONE real_prd = self.join_rec("*", reals, PREC_PRODUCT) if len(complexes) == 1: myprec = PREC_PRODUCT else: myprec = PREC_NONE complex_prd = self.rec(complexes[0], myprec) for child in complexes[1:]: complex_prd = "%s_mul(%s, %s)" % (tgt_name, complex_prd, self.rec(child, PREC_NONE)) if real_prd: # elementwise semantics are correct result = "%s * %s" % (real_prd, complex_prd) else: result = complex_prd return self.parenthesize_if_needed(result, enclosing_prec, PREC_PRODUCT)
def map_product(self, expr, enclosing_prec): tgt_dtype = self.infer_type(expr) is_complex = "c" == tgt_dtype.kind if not is_complex: return CCodeMapperBase.map_product(self, expr, enclosing_prec) else: tgt_name = complex_type_name(tgt_dtype) reals = [ child for child in expr.children if "c" != self.infer_type(child).kind ] complexes = [ child for child in expr.children if "c" == self.infer_type(child).kind ] from pymbolic.mapper.stringifier import PREC_PRODUCT, PREC_NONE real_prd = self.join_rec("*", reals, PREC_PRODUCT) if len(complexes) == 1: myprec = PREC_PRODUCT else: myprec = PREC_NONE complex_prd = self.rec(complexes[0], myprec) for child in complexes[1:]: complex_prd = "{}_mul({}, {})".format( tgt_name, complex_prd, self.rec(child, PREC_NONE)) if real_prd: result = f"{tgt_name}_rmul({real_prd}, {complex_prd})" else: result = complex_prd return self.parenthesize_if_needed(result, enclosing_prec, PREC_PRODUCT)