X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fidx.h;h=8f952b8453590521d61b27ee28f3c2897a05e4da;hp=a54ad7c339c59347dfcda870cd5bad47ecceef18;hb=a4294a62590d45ad81e66ce59101982dc83dba51;hpb=aef64ef1f63f7b4cb9236c5c189873e48c6c999b diff --git a/ginac/idx.h b/ginac/idx.h index a54ad7c3..8f952b84 100644 --- a/ginac/idx.h +++ b/ginac/idx.h @@ -47,14 +47,12 @@ public: // functions overriding virtual functions from bases classes public: - void printraw(std::ostream & os) const; - void printtree(std::ostream & os, unsigned indent) const; - void print(std::ostream & os, unsigned upper_precedence=0) const; + void print(const print_context & c, unsigned level = 0) const; bool info(unsigned inf) const; unsigned nops() const; ex & let_op(int i); -protected: - ex subs(const lst & ls, const lst & lr) const; + bool match(const ex & pattern, lst & repl_lst) const; + ex subs(const lst & ls, const lst & lr, bool no_pattern = false) const; // new virtual functions in this class public: @@ -106,7 +104,8 @@ public: // functions overriding virtual functions from bases classes public: - void print(std::ostream & os, unsigned upper_precedence=0) const; + void print(const print_context & c, unsigned level = 0) const; + bool match(const ex & pattern, lst & repl_lst) const; bool is_dummy_pair_same_type(const basic & other) const; // non-virtual functions in this class @@ -126,6 +125,54 @@ protected: }; +/** This class holds a spinor index that can be dotted or undotted and that + * also has a variance. This is used in the Weyl-van-der-Waerden formalism + * where the dot indicates complex conjugation. There is an associated + * (asymmetric) metric tensor that can be used to raise/lower spinor + * indices. */ +class spinidx : public varidx +{ + GINAC_DECLARE_REGISTERED_CLASS(spinidx, varidx) + + // other constructors +public: + /** Construct index with given value, dimension, variance and dot. + * + * @param v Value of index (numeric or symbolic) + * @param dim Dimension of index space (numeric or symbolic) + * @param covariant Make covariant index (default is contravariant) + * @param dotted Make covariant dotted (default is undotted) + * @return newly constructed index */ + spinidx(const ex & v, const ex & dim = 2, bool covariant = false, bool dotted = false); + + // functions overriding virtual functions from bases classes +public: + void print(const print_context & c, unsigned level = 0) const; + bool match(const ex & pattern, lst & repl_lst) const; + bool is_dummy_pair_same_type(const basic & other) const; + + // non-virtual functions in this class +public: + /** Check whether the index is dotted. */ + bool is_dotted(void) const {return dotted;} + + /** Check whether the index is not dotted. */ + bool is_undotted(void) const {return !dotted;} + + /** Make a new index with the same value and variance but the opposite + * dottedness. */ + ex toggle_dot(void) const; + + /** Make a new index with the same value but opposite variance and + * dottedness. */ + ex toggle_variance_dot(void) const; + + // member variables +protected: + bool dotted; +}; + + // utility functions inline const idx &ex_to_idx(const ex & e) { @@ -137,6 +184,11 @@ inline const varidx &ex_to_varidx(const ex & e) return static_cast(*e.bp); } +inline const spinidx &ex_to_spinidx(const ex & e) +{ + return static_cast(*e.bp); +} + /** Check whether two indices form a dummy pair. */ bool is_dummy_pair(const idx & i1, const idx & i2); @@ -191,10 +243,6 @@ inline unsigned count_free_indices(const exvector & v) return free_indices.size(); } -/** Given two index vectors, find those indices that appear in the first - * vector but not in the second one (asymmetric set difference). */ -exvector index_set_difference(const exvector & set1, const exvector & set2); - } // namespace GiNaC #endif // ndef __GINAC_IDX_H__