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@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());
participants (1)
-
Vladimir Kisil