Re: Re: Locating common subexpressions

```I'm curious:

does OptimizationLevel->2 produce any substantial difference from it's
default value of 1?

I ask because I wasn't able to detect any difference visually, but I
also wasn't able to do a part by part comparison using MatchQ,
Extract, and Position because OptimizeExpression seems to ignore me if
I decrease \$ModuleNumber.

(usually I use MatchQ[Extract[xpr1,#],Extract[xpr2,#]]&/@Position[xpr1,_]
when the expressions are almost identical to see where they differ,
but the different temporary variable names make this difficult)

On 9/13/06, Daniel Lichtblau <danl at wolfram.com> wrote:
> > The strangest thing about the behvior of Simplify in my
> > previous post can be seen at a glance:
> >
> >   R = (3 + 3*a^2 + Sqrt[5 + 6*a + 5*a^2] + a*(4 + Sqrt[5 + 6*a +
> > 5*a^2]))/6
> >   R = Simplify[R,a>=0]
> >   (3 + 3*a^2 + Sqrt[5 + 6*a + 5*a^2] + a*(4 + Sqrt[5 + 6*a + 5*a^2]))/6
> >
> > The subexpression Sqrt[5 + 6*a + 5*a^2] is not located. Ideally
> > Simplify should right away replace that by a temp, say t\$, and
> > get to work on
> >
> >   (3 + 3*a^2 + t\$ + a*(4 + t\$))/6
> >
> > where from the assumptions, t\$>0 and real. Of course the leaf count
> > of t\$ should influence subsequent transformations.
> > This initial pass is useful in complicated expressions that come, eg,
> > from an equation solver since messy subexpressions like the
> > discriminant may appear in several places. I had some of those
> > with leaf counts in the tens of thousands.
> >
> > Locating common subs is of course an key task of optimizing
> > compilers. Simplification and compilation share some objectives,
> > although compilers have to deal with timing and side effects. In fact
> > I wouldnt mind at all if Simplify would return a compound expression:
> >
> > Block [{t\$}, t\$=Sqrt[5 + 6*a + 5*a^2];  (3 + 4*a + 3*a^2 + (1 +
> > a)*t\$)/6 ]
> >
> > since this is perfect for documentation, or conversion to low-level
> > code.
>
> If you want CSE you can use OptimizeExpression in Experimental` context.
>
> In[8]:= InputForm[Experimental`OptimizeExpression[(3 + 3*a^2 + Sqrt[5 +
> 6*a + 5*a^2] + a*(4 + Sqrt[5 + 6*a + 5*a^2]))/6]]
>
> Out[8]//InputForm=
> Experimental`OptimizedExpression[Block[{\$\$25, \$\$27, \$\$28, \$\$29, \$\$30},
>    \$\$25 = a^2; \$\$27 = 6*a; \$\$28 = 5*\$\$25; \$\$29 = 5 + \$\$27 + \$\$28;
>     \$\$30 = Sqrt[\$\$29]; (3 + 3*\$\$25 + \$\$30 + a*(4 + \$\$30))/6]]
>
> This sort of thing is not a part of the Simplify "charter", but is very
> much the intent of OptimizeExpression. As you might suspect, this is
> meant for reforming expressions prior to conversion to lower level
> languages such as C or the byte code of Mathematica's Compile virtual
> machine.
>
>
> Daniel Lichtblau
> Wolfram Research
>
>

--
http://chris.chiasson.name/

```

• Prev by Date: Re: trivial question
• Next by Date: Re: Re: Extracting terms from an equation
• Previous by thread: Re: Locating common subexpressions
• Next by thread: Re: Re: Locating common subexpressions