From f559bf81166ecba0597a9d106b694dd04b9005f6 Mon Sep 17 00:00:00 2001
From: "Vladimir V. Kisil" <kisilv@maths.leeds.ac.uk>
Date: Wed, 21 Jan 2015 10:35:07 +0000
Subject: [PATCH 5/5] Small optimization in simplify_indexed. If the new
 expression is product again then we call the same function return
 simplify_indexed_product() rather than the its mother implify_indexed().

---
 ginac/indexed.cpp | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/ginac/indexed.cpp b/ginac/indexed.cpp
index e8ca5ce..bd13ea2 100644
--- a/ginac/indexed.cpp
+++ b/ginac/indexed.cpp
@@ -874,8 +874,16 @@ contraction_done:
 					// Non-commutative products are always re-expanded to give
 					// eval_ncmul() the chance to re-order and canonicalize
 					// the product
+					bool is_a_product = (is_exactly_a<mul>(*it1) || is_exactly_a<ncmul>(*it1)) &&
+						(is_exactly_a<mul>(*it2) || is_exactly_a<ncmul>(*it2));
 					ex r = (non_commutative ? ex(ncmul(v, true)) : ex(mul(v)));
-					return simplify_indexed(r, free_indices, dummy_indices, sp);
+
+					// If new expression is a product we can call this function again,
+					// otherwise we need to pass argument to simplify_indexed() to be expanded
+					if (is_a_product)
+						return simplify_indexed_product(r, free_indices, dummy_indices, sp);
+					else
+						return simplify_indexed(r, free_indices, dummy_indices, sp);
 				}
 
 				// Both objects may have new indices now or they might
-- 
2.1.4

