[GiNaC-list] Symbol/Constant Ordering
varg at metalica.kh.ua
Thu Dec 11 11:44:21 CET 2008
On Wed, Dec 10, 2008 at 11:55:38PM +0000, Freddie Witherden wrote:
> I am wondering how one might go about changing the order in which
> variables appear in an expression.
Basically, the answer is: don't do that, it *really* hurts. See e.g.
> E.g. if one had: symbol x("x"),
> y("y"), z("z"); ex myExpr = x * y * z * Pi; cout << myExpr; currently
> yields x*y*Pi*z.
The order of terms in the *output* is completely different thing. And it
doesn't have to match the order of terms in the internal representation.
So, if you want to print terms in some specific way, write a custom printing
function (or even a printing context).
> If, for instance, I wanted Pi * x * y * z, how would I go about this?
> While the documentation speaks about ordering of vectors/maps using
> ex_is_less and a mention that it is used internally by GiNaC it does
> not (as far as I can tell) explain how to do it for expressions.
First of all, the ordering provided by ex_is_less is very different from
what you need. Its purpose is completely different: ex_is_less is
a [reasonably] efficient strict weak ordering on expressions (thus one can
establish canonical order of terms reasonably fast, use expressions as
a keys for associative arrays, etc.)
Secondly, GiNaC (internally) sorts terms in sums and products with ex_is_less
(or its equivalent). If you sort them once more, nothing is going to change.
> (Is it possible to get it as a vector, which could then be sorted using a
> custom function?)
ex e = /* something */ ;
std::copy(e.begin(), e.end(), std::back_inserter(ev));
All science is either physics or stamp collecting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Size: 835 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-list/attachments/20081211/7a15a156/attachment.sig
More information about the GiNaC-list