From: Jens Vollinga Date: Mon, 15 Oct 2007 23:49:58 +0000 (+0000) Subject: - Helps to avoid useless (and expansive) rename_dummy_indices_uniquely() [Sheplyakov]. X-Git-Tag: release_1-3-9~12 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=commitdiff_plain;h=e3be2c744b6645b427bcb191344455eb9b8a2696;p=ginac.git - Helps to avoid useless (and expansive) rename_dummy_indices_uniquely() [Sheplyakov]. --- diff --git a/ginac/flags.h b/ginac/flags.h index 33622f9b..478da32a 100644 --- a/ginac/flags.h +++ b/ginac/flags.h @@ -30,7 +30,8 @@ class expand_options { public: enum { expand_indexed = 0x0001, ///< expands (a+b).i to a.i+b.i - expand_function_args = 0x0002 ///< expands the arguments of functions + expand_function_args = 0x0002, ///< expands the arguments of functions + expand_rename_idx = 0x0004 ///< used internally by mul::expand() }; }; diff --git a/ginac/mul.cpp b/ginac/mul.cpp index d6ff7cb9..b7e0e827 100644 --- a/ginac/mul.cpp +++ b/ginac/mul.cpp @@ -950,9 +950,13 @@ ex mul::expand(unsigned options) const return (new mul(*this))->setflag(status_flags::dynallocated | status_flags::expanded); } - const bool skip_idx_rename = ! info(info_flags::has_indices); - if (skip_idx_rename) - ++(mul_expand_stats::n_indexless); + // do not rename indices if the object has no indices at all + if ((!(options & expand_options::expand_rename_idx)) && + this->info(info_flags::has_indices)) + options |= expand_options::expand_rename_idx; + + const bool skip_idx_rename = !(options & expand_options::expand_rename_idx); + // First, expand the children std::auto_ptr expanded_seqp = expandchildren(options); const epvector & expanded_seq = (expanded_seqp.get() ? *expanded_seqp : seq); diff --git a/ginac/power.cpp b/ginac/power.cpp index 010af6c9..42e14c18 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -918,8 +918,13 @@ ex power::expand_mul(const mul & m, const numeric & n, unsigned options, bool fr return _ex1; } + // do not bother to rename indices if there are no any. + if ((!(options & expand_options::expand_rename_idx)) + && m.info(info_flags::has_indices)) + options |= expand_options::expand_rename_idx; // Leave it to multiplication since dummy indices have to be renamed - if (m.info(info_flags::has_indices) && (get_all_dummy_indices(m).size() > 0) && n.is_positive()) { + if ((!(options & expand_options::expand_rename_idx)) && + (get_all_dummy_indices(m).size() > 0) && n.is_positive()) { ex result = m; for (int i=1; i < n.to_int(); i++) result *= rename_dummy_indices_uniquely(m,m);