Be careful when applying algebraic optimizations to computer numbers. For example,
a + (b - c) = (a + b) - c doesn’t hold if a, b and c are floating point numbers, a and “b - c” are small, and b and c are large. “a + (b - c)” will experience less underflow and will deliver a more accurate result. Julian > On Jun 2, 2023, at 7:15 PM, <[email protected]> <[email protected]> wrote: > > I have seen the constant folding rules you mention in [2], but these seen to > require all operands to be compile-time known. > Algebraic optimization rules can work even when only some of the operands are > constant, such as addition of an arbitrary expression with zero. > > I will take a look at the simplification code to see whether it handles such > cases. > > Thank you, > Mihai > > -----Original Message----- > From: Jiajun Xie > Sent: Friday, June 02, 2023 7:08 PM > To: [email protected] > Subject: Re: Algebraic optimizations rule > > Hello, mbudiu: > > Based on my experience, constant folding can occur in two stages. > - Enable it by `RelBuilder$Config$withSimplify`[1] in the convert stage > - Add `RelOptRules$CONSTANT_REDUCTION_RULES`[2] in the optimize stage > > If your RexNode is not complex, you can directly use RexSimplify. For example > ```[3] > final RexSimplify simplify = > new RexSimplify(rexBuilder, RelOptPredicateList.EMPTY, > RexUtil.EXECUTOR) > .withParanoid(true); > return simplify.simplifyUnknownAs(e, RexUnknownAs.UNKNOWN); ``` > > > [1] > https://github.com/apache/calcite/blob/8ea4160f10e95aca6c3b0029d505bbc56975a873/core/src/main/java/org/apache/calcite/tools/RelBuilder.java#L4841 > [2] > https://github.com/apache/calcite/blob/8ea4160f10e95aca6c3b0029d505bbc56975a873/core/src/main/java/org/apache/calcite/plan/RelOptRules.java#L132 > [3] > https://github.com/apache/calcite/blob/8ea4160f10e95aca6c3b0029d505bbc56975a873/core/src/test/java/org/apache/calcite/rex/RexProgramTestBase.java#L187 > > On Sat, 3 Jun 2023 at 04:33, <[email protected]> wrote: > >> Hello, >> >> >> >> I was looking for rules that apply algebraic optimizations to RexNode >> expressions, such as 0 + x = x, but I couldn't find any. >> >> Is there such a rule? >> >> >> >> Mihai >> >> >
