]> www.ginac.de Git - ginac.git/commitdiff
Bug in expand_dummy_sum is fixed.
authorChris Dams <Chris.Dams@mi.infn.it>
Mon, 7 Aug 2006 16:13:43 +0000 (16:13 +0000)
committerChris Dams <Chris.Dams@mi.infn.it>
Mon, 7 Aug 2006 16:13:43 +0000 (16:13 +0000)
doc/tutorial/ginac.texi
ginac/container.h
ginac/indexed.cpp
ginac/indexed.h
ginac/inifcns.cpp

index 7235248ad7e8942b682794447d5ce20a5908b63f..815064a9a7426ef8eb23046ee49f620da6cf3f6c 100644 (file)
@@ -2674,11 +2674,7 @@ arithmetic class, you just pass it to @code{simplify_indexed()}):
 The @code{scalar_products} object @code{sp} acts as a storage for the
 scalar products added to it with the @code{.add()} method. This method
 takes three arguments: the two expressions of which the scalar product is
-taken, and the expression to replace it with. After @code{sp.add(A, B, 0)},
-@code{simplify_indexed()} will replace all scalar products of indexed
-objects that have the symbols @code{A} and @code{B} as base expressions
-with the single value 0. The number, type and dimension of the indices
-don't matter; @samp{A~mu~nu*B.mu.nu} would also be replaced by 0.
+taken, and the expression to replace it with.
 
 @cindex @code{expand()}
 The example above also illustrates a feature of the @code{expand()} method:
index 21e7d4ce52564e6ba7f857756ce45b05ba0acd78..57749cd52ec38f1423fd300eae5d4e5dfd3712e3 100644 (file)
@@ -129,6 +129,7 @@ template <template <class T, class = std::allocator<T> > class C>
 class container : public basic, public container_storage<C> {
        GINAC_DECLARE_REGISTERED_CLASS(container, basic)
 
+protected:
        typedef typename container_storage<C>::STLT STLT;
 
 public:
index 154559800880b5384639f9afa67b00040d38554e..05c3b90a58f0fc793344d4a02c7eb69718957edb 100644 (file)
@@ -1395,44 +1395,33 @@ ex expand_dummy_sum(const ex & e, bool subs_idx)
        pointer_to_map_function_1arg<bool> fcn(expand_dummy_sum, subs_idx);
        if (is_a<add>(e_expanded) || is_a<lst>(e_expanded) || is_a<matrix>(e_expanded)) {
                return e_expanded.map(fcn);
-       } else if (is_a<ncmul>(e_expanded) || is_a<mul>(e_expanded) || is_a<power>(e_expanded)) {
-               exvector v = get_all_dummy_indices(e_expanded);
-               exvector::const_iterator it = v.begin(), itend = v.end();
-               while (it != itend) {
-                       varidx nu = ex_to<varidx>(*it);
-                       if (nu.is_dim_numeric()) {
-                               ex en = 0;
-                               for (int i=0; i < ex_to<numeric>(nu.get_dim()).to_int(); i++) {
-                                       if (is_a<varidx>(nu) && !subs_idx) {
-                                               en += e_expanded.subs(lst(nu == varidx(i, nu.get_dim(), true), nu.toggle_variance() == varidx(i, nu.get_dim())));
-                                       } else {
-                                               en += e_expanded.subs(lst(nu == idx(i, nu.get_dim()), nu.toggle_variance() == idx(i, nu.get_dim())));
-                                       }
-                               }
-                               return expand_dummy_sum(en, subs_idx);
-                       } 
-                       ++it;
-               }
-               return e;
-       } else if (is_a<indexed>(e_expanded)) {
-               exvector v = ex_to<indexed>(e_expanded).get_dummy_indices();
-               exvector::const_iterator it = v.begin(), itend = v.end();
-               while (it != itend) {
-                       varidx nu = ex_to<varidx>(*it);
-                       if (nu.is_dim_numeric()) {
+       } else if (is_a<ncmul>(e_expanded) || is_a<mul>(e_expanded) || is_a<power>(e_expanded) || is_a<indexed>(e_expanded)) {
+               exvector v;
+               if (is_a<indexed>(e_expanded))
+                       v = ex_to<indexed>(e_expanded).get_dummy_indices();
+               else
+                       v = get_all_dummy_indices(e_expanded);
+               ex result = e_expanded;
+               for(exvector::const_iterator it=v.begin(); it!=v.end(); ++it) {
+                       ex nu = *it;
+                       if (ex_to<idx>(nu).get_dim().info(info_flags::nonnegint)) {
+                               int idim = ex_to<numeric>(ex_to<idx>(nu).get_dim()).to_int();
                                ex en = 0;
-                               for (int i=0; i < ex_to<numeric>(nu.get_dim()).to_int(); i++) {
-                                       if (is_a<varidx>(nu) && !subs_idx) {
-                                               en += e_expanded.subs(lst(nu == varidx(i, nu.get_dim(), true), nu.toggle_variance() == varidx(i, nu.get_dim())));
+                               for (int i=0; i < idim; i++) {
+                                       if (subs_idx && is_a<varidx>(nu)) {
+                                               ex other = ex_to<varidx>(nu).toggle_variance();
+                                               en += result.subs(lst(
+                                                       nu == idx(i, idim),
+                                                       other == idx(i, idim)
+                                               ));
                                        } else {
-                                               en += e_expanded.subs(lst(nu == idx(i, nu.get_dim()), nu.toggle_variance() == idx(i, nu.get_dim())));
+                                               en += result.subs( nu.op(0) == i );
                                        }
                                }
-                               return expand_dummy_sum(en, subs_idx);
-                       } 
-                       ++it;
+                               result = en;
+                       }
                }
-               return e;
+               return result;
        } else {
                return e;
        }
index ad32c2372fee25e55e0fef167de8be32000eeea0..8288441f441815a610219763fa271cda48ae1143 100644 (file)
@@ -258,7 +258,7 @@ ex rename_dummy_indices_uniquely(const ex & a, const ex & b);
 
 /** This function returns the given expression with expanded sums
  *  for all dummy index summations, where the dimensionality of 
- *  the dummy index is numeric.
+ *  the dummy index is a nonnegative integer.
  *  Optionally all indices with a variance will be substituted by 
  *  indices with the corresponding numeric values without variance.
  *
index e7ab635aa847eaa0644e9d48c4e8e602fe7fa6dd..256d131575503e10e2c6f27024fb746918cd0e34 100644 (file)
@@ -589,7 +589,7 @@ ex lsolve(const ex &eqns, const ex &symbols, unsigned options)
        
        // syntax checks
        if (!eqns.info(info_flags::list)) {
-               throw(std::invalid_argument("lsolve(): 1st argument must be a list"));
+               throw(std::invalid_argument("lsolve(): 1st argument must be a list or an equation"));
        }
        for (size_t i=0; i<eqns.nops(); i++) {
                if (!eqns.op(i).info(info_flags::relation_equal)) {
@@ -597,7 +597,7 @@ ex lsolve(const ex &eqns, const ex &symbols, unsigned options)
                }
        }
        if (!symbols.info(info_flags::list)) {
-               throw(std::invalid_argument("lsolve(): 2nd argument must be a list"));
+               throw(std::invalid_argument("lsolve(): 2nd argument must be a list or a symbol"));
        }
        for (size_t i=0; i<symbols.nops(); i++) {
                if (!symbols.op(i).info(info_flags::symbol)) {