diff --git a/pystencils/backends/cbackend.py b/pystencils/backends/cbackend.py index d6d6760c7eb35396d8b7898bb1c373e8e4ab00b4..ccd70e9974f8f17f9454081553fb10849c88425d 100644 --- a/pystencils/backends/cbackend.py +++ b/pystencils/backends/cbackend.py @@ -539,11 +539,11 @@ class CustomSympyPrinter(CCodePrinter): def _print_Abs(self, expr): if expr.args[0].is_integer: return f'abs({self._print(expr.args[0])})' - elif get_type_of_expression(expr).is_half(): + elif hasattr(get_type_of_expression(expr), "is_half") and get_type_of_expression(expr).is_half(): # TODO outsource this check to the AST optimization or even better to the introduction of abs() in HFG # FIXME evaluate the rhs just once return f'({self._print(expr.args[0])} < 0) ? {self._print(sp.Mul(sp.Integer(-1), expr.args[0]))} : {self._print(expr.args[0])}' - elif get_type_of_expression(expr).identifier is not None: + elif hasattr(get_type_of_expression(expr), "identifier") and get_type_of_expression(expr).identifier is not None: # In HyTeG fabs and float32 don't like each ofter for whatever reason... return f'abs({self._print(expr.args[0])})' else: @@ -888,6 +888,8 @@ class VectorizedCustomSympyPrinter(CustomSympyPrinter): else: exp = expr.exp + exp_num, exp_denom = sp.fraction(exp) + # TODO the printer should not have any intelligence like this. # TODO To remove all of these cases the vectoriser needs to be reworked. See loop cutting if exp.is_integer and exp.is_number and 0 < exp < 8: @@ -901,6 +903,11 @@ class VectorizedCustomSympyPrinter(CustomSympyPrinter): return root elif exp == -0.5: return self.instruction_set['/'].format(one, root, **self._kwargs) + elif exp_denom == 2 and exp_num.is_integer: + return self._print( + sp.Mul(*[sp.Mul(*[expr.base] * exp_num, evaluate=False), + expr.base ** 0.5], + evaluate=False)) else: raise ValueError("Generic exponential not supported: " + str(expr))