不在 sympy 的“printing.ccode”方法中将 X*X*X 收缩为 pow(X,3)

Not contract X*X*X to pow(X,3) in sympy's `printing.ccode` method

我有一个需要转换为 CUDA 的 sympy 方程。

在其默认配置中,sympy.printing.ccode 会将表达式 x*x 转换为 pow(x,2) 不幸的是,CUDA 的行为有点奇怪(例如 pow(0.1,2) 是 0 根据到 CUDA)。

我希望 sympy.printing.ccode 保持这些类型的表达式不变,或者换句话说,我希望它将 pow 的任何实例扩展为一个简单的产品。例如。 pow(x,4) 会变成 x*x*x*x -- 有人知道如何实现吗?

应该这样做:

>>> import sympy as sp
>>> from sympy.utilities.codegen import CCodePrinter
>>> print(sp.__version__)
0.7.6.1
>>> x = sp.Symbol('x')
>>> CCodePrinter().doprint(x*x*x)
'pow(x, 3)'
>>> class MyCCodePrinter(CCodePrinter):
...     def _print_Pow(self, expr):
...         if expr.exp.is_integer and expr.exp.is_number:
...             return '(' + '*'.join([self._print(expr.base)]*expr.exp) + ')'
...         else:
...             return super(MyCCodePrinter, self)._print_Pow(expr)
... 
>>> MyCCodePrinter().doprint(x*x*x)
'x*x*x'

请注意,这是提议的更改(对指数的大小有限制)for a while。然后动机是常规 C 代码的性能,但是 -ffast-math 等标志没有实际意义。但是,如果这对 CUDA 代码有用,我们绝对应该通过设置支持该行为,如果您认为需要,请随时为其提出问题。