[GiNaC-devel] [PATCH 4/4] introduce expand_options::expand_idx_rename and use it in mul::expand().

Alexei Sheplyakov varg at theor.jinr.ru
Mon Sep 17 15:24:25 CEST 2007


This helps mul::expand() and friends to recognize objects which have
no indices at all.

---
 ginac/flags.h   |    3 ++-
 ginac/mul.cpp   |    8 +++++++-
 ginac/power.cpp |    7 ++++++-
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/ginac/flags.h b/ginac/flags.h
index 372b899..39a2113 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 298715b..4e95a63 100644
--- a/ginac/mul.cpp
+++ b/ginac/mul.cpp
@@ -1002,7 +1002,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);
+	// 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);
diff --git a/ginac/power.cpp b/ginac/power.cpp
index cc003bc..7d909e8 100644
--- a/ginac/power.cpp
+++ b/ginac/power.cpp
@@ -1009,8 +1009,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 (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;
 		exvector va = get_all_dummy_indices(m);
 		sort(va.begin(), va.end(), ex_is_less());
-- 
1.5.2.4

Best regards,
  Alexei

-- 
All science is either physics or stamp collecting.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-devel/attachments/20070917/8ec8ebb1/attachment.pgp


More information about the GiNaC-devel mailing list