X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Findexed.h;h=ad32c2372fee25e55e0fef167de8be32000eeea0;hb=6eca7546c3ef806e01e393255de7c2bdfc011ea8;hp=ad18ddb55f91c568e1b09f727a4f8b814ff59329;hpb=34704348ad3e512010cbf85b6a9dee9fff22cd66;p=ginac.git diff --git a/ginac/indexed.h b/ginac/indexed.h index ad18ddb5..ad32c237 100644 --- a/ginac/indexed.h +++ b/ginac/indexed.h @@ -3,7 +3,7 @@ * Interface to GiNaC's indexed expressions. */ /* - * GiNaC Copyright (C) 1999-2002 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2005 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __GINAC_INDEXED_H__ @@ -26,6 +26,7 @@ #include #include "exprseq.h" +#include "wildcard.h" namespace GiNaC { @@ -139,21 +140,20 @@ public: // internal constructors indexed(const symmetry & symm, const exprseq & es); indexed(const symmetry & symm, const exvector & v, bool discardable = false); - indexed(const symmetry & symm, exvector * vp); // vp will be deleted + indexed(const symmetry & symm, std::auto_ptr vp); // functions overriding virtual functions from base classes public: - void print(const print_context & c, unsigned level = 0) const; - unsigned precedence(void) const {return 55;} + unsigned precedence() const {return 55;} bool info(unsigned inf) const; ex eval(int level = 0) const; - exvector get_free_indices(void) const; + exvector get_free_indices() const; protected: ex derivative(const symbol & s) const; - ex thisexprseq(const exvector & v) const; - ex thisexprseq(exvector * vp) const; - unsigned return_type(void) const { return return_types::commutative; } + ex thiscontainer(const exvector & v) const; + ex thiscontainer(std::auto_ptr vp) const; + unsigned return_type() const { return return_types::commutative; } ex expand(unsigned options = 0) const; // new virtual functions which can be overridden by derived classes @@ -166,13 +166,14 @@ public: bool all_index_values_are(unsigned inf) const; /** Return a vector containing the object's indices. */ - exvector get_indices(void) const; + exvector get_indices() const; /** Return a vector containing the dummy indices of the object, if any. */ - exvector get_dummy_indices(void) const; + exvector get_dummy_indices() const; /** Return a vector containing the dummy indices in the contraction with - * another indexed object. */ + * another indexed object. This is symmetric: a.get_dummy_indices(b) + * == b.get_dummy_indices(a) */ exvector get_dummy_indices(const indexed & other) const; /** Check whether the object has an index that forms a dummy index pair @@ -180,11 +181,15 @@ public: bool has_dummy_index_for(const ex & i) const; /** Return symmetry properties. */ - ex get_symmetry(void) const {return symtree;} + ex get_symmetry() const {return symtree;} protected: void printindices(const print_context & c, unsigned level) const; - void validate(void) const; + void print_indexed(const print_context & c, const char *openbrace, const char *closebrace, unsigned level) const; + void do_print(const print_context & c, unsigned level) const; + void do_print_latex(const print_latex & c, unsigned level) const; + void do_print_tree(const print_tree & c, unsigned level) const; + void validate() const; // member variables protected: @@ -192,17 +197,21 @@ protected: }; -typedef std::pair spmapkey; +class spmapkey { +public: + spmapkey() : dim(wild()) {} + spmapkey(const ex & v1, const ex & v2, const ex & dim = wild()); + + bool operator==(const spmapkey &other) const; + bool operator<(const spmapkey &other) const; + + void debugprint() const; -struct spmapkey_is_less { - bool operator() (const spmapkey &p, const spmapkey &q) const - { - int cmp = p.first.compare(q.first); - return ((cmp<0) || (!(cmp>0) && p.second.compare(q.second)<0)); - } +protected: + ex v1, v2, dim; }; -typedef std::map spmap; +typedef std::map spmap; /** Helper class for storing information about known scalar products which * are to be automatically replaced by simplify_indexed(). @@ -213,21 +222,22 @@ public: /** Register scalar product pair and its value. */ void add(const ex & v1, const ex & v2, const ex & sp); + /** Register scalar product pair and its value for a specific space dimension. */ + void add(const ex & v1, const ex & v2, const ex & dim, const ex & sp); + /** Register list of vectors. This adds all possible pairs of products * a.i * b.i with the value a*b (note that this is not a scalar vector * product but an ordinary product of scalars). */ - void add_vectors(const lst & l); + void add_vectors(const lst & l, const ex & dim = wild()); /** Clear all registered scalar products. */ - void clear(void); - - bool is_defined(const ex & v1, const ex & v2) const; - ex evaluate(const ex & v1, const ex & v2) const; - void debugprint(void) const; + void clear(); -private: - static spmapkey make_key(const ex & v1, const ex & v2); + bool is_defined(const ex & v1, const ex & v2, const ex & dim) const; + ex evaluate(const ex & v1, const ex & v2, const ex & dim) const; + void debugprint() const; +protected: spmap spm; /*< Map from defined scalar product pairs to their values */ }; @@ -240,6 +250,23 @@ template<> inline bool is_exactly_a(const basic & obj) return obj.tinfo()==TINFO_indexed; } +/** Returns all dummy indices from the expression */ +exvector get_all_dummy_indices(const ex & e); + +/** Returns b with all dummy indices, which are common with a, renamed */ +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. + * Optionally all indices with a variance will be substituted by + * indices with the corresponding numeric values without variance. + * + * @param e the given expression + * @param subs_idx indicates if variance of dummy indixes should be neglected + */ +ex expand_dummy_sum(const ex & e, bool subs_idx = false); + } // namespace GiNaC #endif // ndef __GINAC_INDEXED_H__