X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Findexed.h;h=aac4625c8d6f37a4ca06b461222ec3ff3c2ca993;hp=f539444e7b29f04b39edf42bbf38d0059ecd1924;hb=a68aee97d9ebdac8a6ac81f1e41961e6bc792468;hpb=9f015041142625abf6645b3ea39c62b59a5f442c diff --git a/ginac/indexed.h b/ginac/indexed.h index f539444e..aac4625c 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-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 { @@ -139,20 +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; - 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 @@ -165,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 @@ -179,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: @@ -191,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(). @@ -212,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 */ };