X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Findexed.h;h=aac4625c8d6f37a4ca06b461222ec3ff3c2ca993;hp=222107081ca3cbeb5449ddf2a11d49f1196aee90;hb=a68aee97d9ebdac8a6ac81f1e41961e6bc792468;hpb=276f1bc79bd0f41a12fb45ece6c7857e13c6668e diff --git a/ginac/indexed.h b/ginac/indexed.h index 22210708..aac4625c 100644 --- a/ginac/indexed.h +++ b/ginac/indexed.h @@ -3,7 +3,7 @@ * Interface to GiNaC's indexed expressions. */ /* - * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2004 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 @@ -26,6 +26,7 @@ #include #include "exprseq.h" +#include "wildcard.h" namespace GiNaC { @@ -42,6 +43,7 @@ class indexed : public exprseq friend ex simplify_indexed(const ex & e, exvector & free_indices, exvector & dummy_indices, const scalar_products & sp); friend ex simplify_indexed_product(const ex & e, exvector & free_indices, exvector & dummy_indices, const scalar_products & sp); + friend bool reposition_dummy_indices(ex & e, exvector & variant_dummy_indices, exvector & moved_indices); // other constructors public: @@ -138,22 +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() const {return 55;} bool info(unsigned inf) const; ex eval(int level = 0) const; - int degree(const ex & s) const; - int ldegree(const ex & s) const; - ex coeff(const ex & s, int n = 1) const; - exvector get_free_indices(void) const; + exvector get_free_indices() const; protected: - ex thisexprseq(const exvector & v) const; - ex thisexprseq(exvector * vp) const; - unsigned return_type(void) const { return return_types::commutative; } + ex derivative(const symbol & s) const; + 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; -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)); - } + void debugprint() const; + +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,29 +222,32 @@ 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 */ }; // utility functions -inline const indexed &ex_to_indexed(const ex &e) + +/** Specialization of is_exactly_a(obj) for indexed objects. */ +template<> inline bool is_exactly_a(const basic & obj) { - return static_cast(*e.bp); + return obj.tinfo()==TINFO_indexed; } } // namespace GiNaC