From: Christian Bauer Date: Mon, 2 Aug 2004 21:44:44 +0000 (+0000) Subject: synced to HEAD (power::get_free_indices()) [Alexei Sheplyakov] X-Git-Tag: release_1-2-2~4 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=commitdiff_plain;h=8581b6818314e3eba844e8e065677a46f6882ca1;p=ginac.git synced to HEAD (power::get_free_indices()) [Alexei Sheplyakov] --- diff --git a/check/exam_indexed.cpp b/check/exam_indexed.cpp index 3d9b307d..e20b5643 100644 --- a/check/exam_indexed.cpp +++ b/check/exam_indexed.cpp @@ -375,6 +375,15 @@ static unsigned dummy_check() e = indexed(p, mu.toggle_variance(), mu) - indexed(p, nu, nu.toggle_variance()); result += check_equal_simplify(e, 0); + // GiNaC 1.2.1 had a bug here because p.i*p.i -> (p.i)^2 + e = indexed(p, i) * indexed(p, i) * indexed(p, j) + indexed(p, j); + ex fi = exprseq(e.get_free_indices()); + if (!fi.is_equal(exprseq(j))) { + clog << "get_free_indices(" << e << ") erroneously returned " + << fi << " instead of (.j)" << endl; + ++result; + } + return result; } diff --git a/ginac/indexed.cpp b/ginac/indexed.cpp index d1d5f728..ad17a497 100644 --- a/ginac/indexed.cpp +++ b/ginac/indexed.cpp @@ -499,10 +499,27 @@ exvector ncmul::get_free_indices() const return free_indices; } +struct is_summation_idx : public std::unary_function { + bool operator()(const ex & e) + { + return is_dummy_pair(e, e); + } +}; + exvector power::get_free_indices() const { - // Return free indices of basis - return basis.get_free_indices(); + // Get free indices of basis + exvector basis_indices = basis.get_free_indices(); + + if (exponent.info(info_flags::even)) { + // If the exponent is an even number, then any "free" index that + // forms a dummy pair with itself is actually a summation index + exvector really_free; + std::remove_copy_if(basis_indices.begin(), basis_indices.end(), + std::back_inserter(really_free), is_summation_idx()); + return really_free; + } else + return basis_indices; } /** Rename dummy indices in an expression.