[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