Optimization¶
After the HOPE specific AST has been created the package performs a static recursive analysis of the expressions to introduce numerical optimization. The supported possibilities are divided into three groups:
Simplification of expressions¶
To simplify expression we have used the SymPy
library. SymPy is a Python library for symbolic mathematics and has been entirely written in Python. To apply the optimization, the AST expression is translated into SymPy
syntax AST and passed to the simplify
function. The function applies various different heuristics to reduce the complexity of the passed expression. The simplification is not exactly defined and varies depending on the input.
For instance, one example of simplification is that \(sin(x)^2 + cos(x)^2\) will be simplified to \(1\).
Factorizing out subexpressions¶
Furthermore the SymPy
library is used to factorize out recurring subexpression (common subexpression elimination) using the previously created SymPy
AST and SymPy
‘s cse
function.
Replacing the pow function for integer exponents¶
From C++11 on, the pow
function in the C standard library is not overloaded for integer exponents. The internal implementation of the computation of a base to the power of a double exponent is typically done using a series expansion, though this may vary depending on the compiler and hardware architecture. Generally this is efficient for double exponents but not necessarily for integer exponents.
HOPE therefore tries to identify power expressions with integer exponents and factorizes the expression into several multiplications e.g. \(y=x^5\) will be decomposed into \(x_2=x^2\) and \(y=x_2\times x_2 \times x\). This reduces the computational costs and increases the performance of the execution.