不在 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 代码有用,我们绝对应该通过设置支持该行为,如果您认为需要,请随时为其提出问题。
我有一个需要转换为 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 代码有用,我们绝对应该通过设置支持该行为,如果您认为需要,请随时为其提出问题。