]> www.ginac.de Git - ginac.git/commitdiff
- Helps to avoid useless (and expansive) rename_dummy_indices_uniquely() [Sheplyakov].
authorJens Vollinga <vollinga@thep.physik.uni-mainz.de>
Mon, 15 Oct 2007 23:49:58 +0000 (23:49 +0000)
committerJens Vollinga <vollinga@thep.physik.uni-mainz.de>
Mon, 15 Oct 2007 23:49:58 +0000 (23:49 +0000)
ginac/flags.h
ginac/mul.cpp
ginac/power.cpp

index 33622f9b67404d6a2932368a007a407a3091b39d..478da32a69da4b80c3aa16dd9941563d18368365 100644 (file)
@@ -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()
        };
 };
 
index d6ff7cb9da51dc8677cfe0514b8601a6b313b098..b7e0e827bb040189d8915987f3162437d245cbd5 100644 (file)
@@ -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<epvector> expanded_seqp = expandchildren(options);
        const epvector & expanded_seq = (expanded_seqp.get() ? *expanded_seqp : seq);
index 010af6c961847f65c2417bed3355f7476a2c52d5..42e14c189352ef7513bac62f69db3da0e682a2b2 100644 (file)
@@ -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);