[GiNaC-devel] Patch for get_dummy_indices
Vladimir Kisil
kisilv at maths.leeds.ac.uk
Mon Nov 8 20:29:04 CET 2004
Dear All,
Presently the method get_dummy_indices() has a non-intuitive
behaviour that it forgets about variance of indices and return all
of them dotted. This is illustrated by the test:
#include <iostream>
#include <ginac/ginac.h>
using namespace std;
using namespace GiNaC;
int main()
{
varidx mu(symbol("mu"), 4);
varidx nu(symbol("nu"), 4, true);
symbol A("A");
symbol B("B");
ex e = indexed(A, nu, mu);
ex e1 = indexed(B, nu.toggle_variance(), mu.toggle_variance());
lst rl = lst(mu, nu);
cout << rl << endl;
// -> {~mu,.nu}
exvector ind_vec = ex_to<indexed>(e).get_dummy_indices(ex_to<indexed>(e1));
for (exvector::const_iterator it = ind_vec.begin(); it != ind_vec.end(); it++) {
cout << ex_to<varidx>(*it) << endl;
// -> .nu .mu
}
return 0;
}
This can be altered in many they and include a patch to idx.cpp which
uses a sorting rule indifferent to variance of indices. If this patch
is applied than a small simplification to clifford.cpp can be done as
well.
With this patches my program seems to run 1.5% faster as well ;-)
Best wishes,
Vladimir
--
Vladimir V. Kisil email: kisilv at maths.leeds.ac.uk
-- www: http://maths.leeds.ac.uk/~kisilv/
Index: ginac/clifford.cpp
===================================================================
RCS file: /home/cvs/GiNaC/ginac/clifford.cpp,v
retrieving revision 1.82
diff -r1.82 clifford.cpp
1114c1114
< S = S * e.op(j).subs(lst(ex_to<varidx>(*it) == ival, ex_to<varidx>(*it).toggle_variance() == ival), subs_options::no_pattern);
---
> S = S * e.op(j).subs(lst(ex_to<varidx>(*it) == ival), subs_options::no_pattern);
Index: ginac/idx.cpp
===================================================================
RCS file: /home/cvs/GiNaC/ginac/idx.cpp,v
retrieving revision 1.62
diff -r1.62 idx.cpp
508a509,519
> // Auxiliary comparison which does not mind the variance of indices
> struct idx_is_less : public std::binary_function<ex, ex, bool> {
> bool operator() (const ex &lh, const ex &rh) const {
> if (is_a<varidx>(lh))
> return (lh.compare(rh) < 0) &&
> (lh.compare(ex_to<varidx>(rh).toggle_variance()) < 0);
> else
> return lh.compare(rh) < 0;
> }
> };
>
528c539
< shaker_sort(v.begin(), v.end(), ex_is_less(), ex_swap());
---
> shaker_sort(v.begin(), v.end(), idx_is_less(), ex_swap());
More information about the GiNaC-devel
mailing list