[GiNaC-devel] Bug(?) in reposition_dummy_indices: test case and patch

Sheplyakov Alexei varg at theor.jinr.ru
Tue Oct 10 21:44:26 CEST 2006


Hello!

On Tue, Oct 10, 2006 at 01:16:21PM +0200, Chris Dams wrote:
> > I don't think your analysis is completely correct. The problem is that
> > 
> > e = e.subs(something) 
> > 
> > calls e.eval(), and eval can change the original expression so that 
> > iterators become invalid. Actually, after the evaluation expression can
> > be *anything*, even not necessarily indexed. For example, the expression
> > in question could evaluate to zero (if someone implements derived class
> > such that for some combination of indices the thing evaluates to zero).
> 
> It is true that an evaluation function can be written such that this goes
> wrong. However, I was assuming that evaluation functions are doing things
> to expressions that make sense. 

First of all, I think it is perfectly sensible for eval() to return zero
(e.g., what about traceless tensors?).

Secondly, your patch does not catch this:
[I admit that example is a little bit weird]

#include <iostream>
#include <stdexcept>
#include <ginac/ginac.h>
using namespace std;
using namespace GiNaC;

int main(int argc, char** argv)
{
	symbol d("d");
	varidx mu(symbol("mu"), d), nu(symbol("nu"), d);

	ex e = indexed(symbol("T"), sy_symm(3, 0, 1, 2),
			mu, nu, mu.toggle_variance(), nu.toggle_variance());
	cout << e << " == > "; 
	e = e.simplify_indexed();
	cout << e << endl;
	return 0;
}

On my system, this gives:

T~mu.nu~nu.mu ==> T~mu.nu.nu.mu

Note that we got invalid expression after the evaluation. 

[snipped]

> Do you know of any evaluation that does make sense where we would 
> encounter this kind of problem? I thought about this, but came to
> the conclusion that this probably cannot happen.

I was trying to implement two classes (derived from indexed) which represent
Riemann and Ricci tensors. I did R~k.i.k.j => r.i.j substitution in
R::eval(). But my code did not work. After a while I found a way to
reproduce the problem with classes which are part of GiNaC.

> On the other hand, as a matter of principle you
> are right that it is best to assume as little about the rest of the code
> as possbile. For this reason I would accept a patch that would do the
> substitutions as they are currently but does not cause eval to be called.

The patch I've posted does that. Is there something wrong/stupid/etc with it?

Best regards,
 Alexei.

-- 
All science is either physics or stamp collecting.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
URL: <http://www.ginac.de/pipermail/ginac-devel/attachments/20061010/006ecdec/attachment.sig>


More information about the GiNaC-devel mailing list